<script>
import {
  GlDisclosureDropdown,
  GlDisclosureDropdownItem,
  GlToggle,
  GlTooltipDirective,
} from '@gitlab/ui';
import { __ } from '~/locale';
import isShowingLabelsQuery from '~/graphql_shared/client/is_showing_labels.query.graphql';
import setIsShowingLabelsMutation from '~/graphql_shared/client/set_is_showing_labels.mutation.graphql';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';

import Tracking from '~/tracking';
import { historyPushState } from '~/lib/utils/common_utils';
import { mergeUrlParams, removeParams } from '~/lib/utils/url_utility';
import { GroupByParamType } from 'ee_else_ce/boards/constants';

const trackingMixin = Tracking.mixin();

export default {
  components: {
    GlDisclosureDropdown,
    GlDisclosureDropdownItem,
    GlToggle,
    LocalStorageSync,
    ToggleEpicsSwimlanes: () => import('ee_component/boards/components/toggle_epics_swimlanes.vue'),
  },
  directives: {
    GlTooltipDirective,
  },
  mixins: [trackingMixin],
  props: {
    showEpicLaneOption: {
      type: Boolean,
      required: false,
      default: false,
    },
    isSwimlanesOn: {
      type: Boolean,
      required: false,
      default: false,
    },
  },
  data() {
    return {
      isShowingLabels: null,
    };
  },
  apollo: {
    isShowingLabels: {
      query: isShowingLabelsQuery,
      update: (data) => data.isShowingLabels,
    },
  },
  computed: {
    trackProperty() {
      return this.isShowingLabels ? 'on' : 'off';
    },
  },
  methods: {
    onToggleSwimLanes() {
      // Track toggle event
      this.track('click_toggle_swimlanes_button', {
        label: 'toggle_swimlanes',
        property: this.isSwimlanesOn ? 'off' : 'on',
      });

      // Track if the board has swimlane active
      if (!this.isSwimlanesOn) {
        this.track('click_toggle_swimlanes_button', {
          label: 'swimlanes_active',
        });
      }

      this.toggleEpicSwimlanes();
    },
    toggleEpicSwimlanes() {
      if (this.isSwimlanesOn) {
        historyPushState(removeParams(['group_by']), window.location.href, true);
        this.$emit('toggleSwimlanes', false);
      } else {
        historyPushState(
          mergeUrlParams({ group_by: GroupByParamType.epic }, window.location.href, {
            spreadArrays: true,
          }),
        );
        this.$emit('toggleSwimlanes', true);
      }
    },
    setShowLabels() {
      this.$apollo.mutate({
        mutation: setIsShowingLabelsMutation,
        variables: {
          isShowingLabels: !this.isShowingLabels,
        },
      });
    },
  },
  i18n: {
    toggleText: __('View options'),
    showLabels: __('Show labels'),
  },
};
</script>
<template>
  <gl-disclosure-dropdown
    v-gl-tooltip-directive.hover="$options.i18n.toggleText"
    category="tertiary"
    icon="preferences"
    no-caret
    :toggle-text="$options.i18n.toggleText"
    text-sr-only
    :auto-close="false"
    data-testid="board-options-dropdown"
  >
    <gl-disclosure-dropdown-item data-testid="show-labels-toggle-item" @action="setShowLabels">
      <template #list-item>
        <local-storage-sync
          :value="isShowingLabels"
          storage-key="gl-show-board-labels"
          @input="setShowLabels"
        />
        <gl-toggle
          :value="isShowingLabels"
          :label="$options.i18n.showLabels"
          :data-track-property="trackProperty"
          data-track-action="toggle"
          data-track-label="show_labels"
          label-position="left"
          aria-describedby="board-labels-toggle-text"
          data-testid="show-labels-toggle"
          class="board-dropdown-toggle gl-flex-direction-row gl-justify-between gl-w-full"
        />
      </template>
    </gl-disclosure-dropdown-item>
    <gl-disclosure-dropdown-item
      v-if="showEpicLaneOption"
      data-testid="epic-swimlanes-toggle-item"
      @action="onToggleSwimLanes"
    >
      <template #list-item>
        <toggle-epics-swimlanes :is-swimlanes-on="isSwimlanesOn" />
      </template>
    </gl-disclosure-dropdown-item>
  </gl-disclosure-dropdown>
</template>
