<template>
  <NuxtLayout name="default" :menu="adminMenu">
    <div>
      <Multiselect
        :allow-empty="false"
        :searchable="true"
        :close-on-select="true"
        :show-labels="false"
        :value="value"
        :options="options"
        class="multi mb-2"
        @select="select"
        label="label"
        track-by="key"
        placeholder="دسته"
        :hide-selected="false"
        :max-height="200"
        :max-width="200"
      >
      </Multiselect>
      <my-table
        height="auto"
        maxHeight="calc(100vh - 9em)"
        class="my-table"
        ref="sectionsTable"
        :hasSearch="false"
        :tableActions="tableActions"
        :items="sections"
        :tableColumns="tableColumns"
        :paginationInfo="pagination"
        :totalPages="pagination.pages"
        @delete-table-item="deleteItem"
        @edit-table-item="editTableItem"
        @page-changed="pageChanged"
        @page-limit-changed="pageLimitChanged"
        @sort-changed="sortChanged"
      >
        <!-- :fetchingData="fetchingData" :totalPages="pagination.pages"
      @delete-table-item="deleteItem" @edit-table-item="toggleRolesPanel"
      @page-changed="pageChanged" @page-limit-changed="pageLimitChanged"
      @sort-changed="sortChanged" -->
        <!-- :paginationInfo="pagination"
      :sortingInfo="sorting -->
      </my-table>
      <base-modal
        v-if="openSubjectForm"
        modalSize="modal-lg"
        :hasFooter="false"
        @close="closeModal"
      >
        <component
          :is="slotComponentName"
          :editList="editList"
          @close="closeModal"
        ></component>
      </base-modal>
    </div>
  </NuxtLayout>
</template>
<script>
import settingsApi from "~/apis/settingsApi";
import adminMenu from "~/json/admin/json/menu.json";
import { mapState, mapActions } from "pinia";
import searchApi from "~/apis/searchApi";
import { useStorage } from "@vueuse/core";
import { useCommonStore } from "~/stores/commonStore";

export default {
  name: "guidesList",
  setup() {
    definePageMeta({
      name: "guidesList",
      layout: false,
    });
  },
  computed: {
    ...mapState(useCommonStore, ["organNameGetter","helpSchemaGetter"]),

    // ...mapState(["organNameGetter"]),

    myActiveSchema() {
      return this.helpSchemaGetter?.find((item) => {
        return item.key == "help";
      });
    },
  },
  mounted() {
    let localStoageHelpSchema = useStorage("settingSchema", undefined).value;

    if (localStoageHelpSchema) {
      let helpSchema = JSON.parse(localStoageHelpSchema);
      this.helpSchemaSetter(helpSchema);
      this.options = this.myActiveSchema?.category;
      this.value = this.myActiveSchema?.category[0];
    } else {
      this.getSchemas();
    }
    this.getList();
  },
  data() {
    return {
      adminMenu: adminMenu,
      options: [{ name: "جستجو" }, { name: "محتوا" }, { name: "مطالعه" }],
      httpService: undefined,
      value: "",
      editList: "",
      slotComponentName: "",
      modalTitle: "",
      openSubjectForm: false,
      listSections: [],
      sections: [],
      tableActions: [
        {
          showOutside: true,
          show: true,
          icon: "tavasi tavasi-Component-242--1",
          title: this.$t("Edit"),
          to: {
            name: "undefined",
          },
          selected: false,
          disabled: false,
          howToOpen: "",
          href: "",
          class: "edit-btn",
          action: "edit-table-item",
          can: "item-info_edit",
        },
        {
          showOutside: true,
          show: true,
          icon: "tavasi tavasi-Component-295--1",
          title: this.$t("Delete"),
          to: {
            name: "undefined",
          },
          selected: false,
          disabled: false,
          howToOpen: "",
          href: "",
          class: "delete-btn",
          action: "delete-table-item",
          can: "item-list_delete",
        },
      ],
      tableColumns: [
        {
          isLink: true,
          key: "title",
          title: "عنوان سوال",
          width: "1",
        },
        {
          key: "description",
          title: "توضیحات",
          width: "6",
        },
      ],
      pagination: {
        page: 1,
        pages: 0,
        total: 0,
        offset: 0,
        limit: 10,
      },
      sorting: "",
    };
  },
  beforeMount() {
    // this.httpService = new HttpService(import.meta.env.VITE_REPO_BASE_URL);
    this.httpService = useNuxtApp()["$http"];
  },
  methods: {
    // ...mapActions("search", ["helpSchemaSetter"]),
    ...mapActions(useCommonStore, ["helpSchemaSetter"]),
    openModal(componentName, title) {
      this.openSubjectForm = true;
      this.slotComponentName = componentName;
      this.modalTitle = title;
      setTimeout(() => {
        $("#meta-item-modal").modal(
          { backdrop: "static", keyboard: false },
          "show"
        );
      }, 500);
    },
    closeModal() {
      $("#base-modal").modal({
        show: false,
      });

      setTimeout(() => {
        this.openSubjectForm = false;
        this.getList();
      }, 1000);
    },
    editTableItem(item) {
      this.editList = this.listSections[item];
      this.openModal("editModalItem", "فیلتر ها");
    },
    deleteItem(item) {
      mySwalConfirm({
        title: "هشدار!!!",
        html: "تمامی اطلاعات  پاک خواهد. آیا مطمئن هستید؟ ",
      }).then((result) => {
        if (result.isConfirmed) {
          var id = this.listSections[item]?._id;
          let url = settingsApi.help.delete;
          url = url.replace("{{id}}", id);
          this.httpService.postRequest(repoUrl() + url).then((response) => {
            mySwalToast({
              title: "با موفقیت حذف شد",
              // html: response.data.message,
              icon: "success",
            });
            this.getList();
          });
        }
      });
    },
    getList() {
      let url = settingsApi.help.list;
      url = url.replace("{{key_option}}", this.value?.key);
      url = url.replace("{{offset}}", this.pagination?.offset);
      url = url.replace("{{limit}}", this.pagination?.limit);
      this.httpService.getRequest(repoUrl() + url).then((response) => {
        let list = response.hits?.hits;
        this.listSections = list;
        if (this.sections.length >= 0) this.sections = [];
        // this.sections = response.hits.hits;
        list.forEach((element) => {
          this.sections.push(element?._source.meta);
        });

        const total = response.hits.total.value;

        const pages = Math.ceil(total / this.pagination.limit);
        const pagination = {
          total: total,
          pages: pages == 0 ? 1 : pages,
        };

        this.pagination = { ...this.pagination, ...pagination };

        // this.pagination = { ...this.pagination, ...response.pagination };
      });
    },
    getSchemas() {
      this.httpService
        .postRequest(repoUrl() + searchApi.schema.list, {
          organ: this.organNameGetter,
          system: "setting",
          build_state: buildState(),
        })
        .then((response) => {
          this.helpSchemaSetter(response.data?.setting);
          this.options = this.myActiveSchema?.category;
          this.value = this.myActiveSchema?.category[0];
          // this.options = response;
        });
    },
    select(e) {
      this.value = e;
      this.getList();
    },

    resetPagination() {
      this.pagination = {
        pages: 0,
        total: 0,
        page: 1,
        offset: 0,
        limit: 10,
      };
    },
    pageLimitChanged(paging) {
      this.resetPagination();
      this.pagination.limit = paging?.limit;

      this.getList();
    },
    pageChanged(paging) {
      let page = paging.pageNumber;
      page -= 1;
      this.pagination.offset = page * paging.limit;
      this.pagination.limit = paging.limit;
      this.pagination.page = paging.pageNumber;

      this.getList();
    },
    sortChanged(sorting) {
      this.pagination.page = this.pagination.offset = 0;
      this.sorting = sorting;

      this.getList();
    },
  },
};
</script>
<style scoped>
.multi {
  width: 200px;
  border: 2px solid rgb(127, 170, 170);
  border-radius: 0.5rem;
}
</style>
