import { mapActions, mapState } from "pinia";
import { useCommonStore } from "~/stores/commonStore";
import { useAuthStore } from "~/stores/authStore";
import adminApi from "~/apis/adminApi";

export default {
  data() {
    return {
      activeTab: "all",

      canView: false,
      fetchingData: false,
      listUnseen: [],
      countUnseen: undefined,
      list: [],
      counts: "",
      notificationItem: undefined,
      buttonLoading: false,
      pagination: {
        page: 1,
        pages: 0,
        total: 0,
        offset: 0,
        limit: 5,
      },
    };
  },
  computed: {
    ...mapState(useAuthStore, ["currentUser", "isGuest"]),
  },

  methods: {
    ...mapActions(useCommonStore, ["checkPermissions"]),
    filterNotifications(newTab) {
      this.activeTab = newTab;
      this.list = [];
      this.getList();
    },
    async checkPermisionBeforGetList(permission) {
      if (this.fetchingData) return;
      this.fetchingData = true;

      return await this.checkPermissions({ permission, _this: this })
        .then(() => {
          this.canView = true;
          // this.fetchingData = false;
        })
        .catch(() => {
          this.canView = false;
          this.fetchingData = false;
        });
    },

    // detelte item.
    async deleteItem({ _id }) {
      if (this.buttonLoading) return;
      this.buttonLoading = true;

      var url = adminApi.notification.delete;
      url = url.replace("{{id}}", _id);
      url = url.replace("{{entity_type}}", "notif");

      try {
        const { $api } = useNuxtApp();
        const res = await $api(url, {
          method: "POST",
          baseURL: repoUrl(),
        });
        this.mySwalToast({
          title: "تبریک",
          html: res.message,
          icon: "success",
        });
        return res;
      } catch (err) {
        this.fetchingData = false;
      }

      // return await this.httpService
      //   .postRequest(url)
      //   .then((res) => {
      //     this.mySwalToast({
      //       title: "تبریک",
      //       html: res.message,
      //       icon: "success",
      //     });
      //   })
      //   .catch((error) => {})
      //   .finally(() => {
      //     this.buttonLoading = false;
      //   });
    },

    // Getting notification item.
    async getNotificationItem(id) {
      let url = adminApi.notification.get;
      url = url.replace("{{id}}", id);

      // this.httpService
      //   .getRequest(url)
      //   .then((res) => {
      //     this.notificationItem = res;
      //   })
      //   .catch(() => {})
      //   .finally(() => {
      //     this.fetchingData = false;
      //   });

      try {
        const { $api } = useNuxtApp();
        const res = await $api(url, {
          method: "get",
          baseURL: repoUrl(),
        });
        this.notificationItem = res;
      } catch (err) {
        this.fetchingData = false;
      }
    },
    // admin
    async getList() {
      let url = adminApi.notification[this.activeTab];
      url = url.replace("{{offset}}", this.pagination.offset);
      url = url.replace("{{limit}}", this.pagination.limit);

      // this.httpService
      //   .getRequest(url)
      //   .then((res) => {
      //     this.list = res.hits.hits;
      //     this.numberOfMark();
      //     const total = res.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 };
      //   })
      //   .catch(() => {})
      //   .finally(() => {
      //     this.fetchingData = false;
      //   });

      try {
        const { $api } = useNuxtApp();
        const res = await $api(url, {
          method: "get",
          baseURL: repoUrl(),
        });
        this.list = res.hits.hits;
        this.numberOfMark();
        const total = res.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 };
      } catch (err) {
        this.fetchingData = false;
      }
    },
    //user
    async getListUnseen() {
      let url = adminApi.notification.listUnseen;

      url = url.replace("{{offset}}", this.pagination.offset);
      url = url.replace("{{limit}}", this.pagination.limit);

      // this.httpService
      //   .getRequest(url)
      //   .then((res) => {
      //     this.listUnseen = res.hits.hits;

      //     const total = res.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 };
      //   })
      //   .catch(() => {})
      //   .finally(() => {
      //     this.fetchingData = false;
      //   });

      try {
        const { $api } = useNuxtApp();
        const res = await $api(url, {
          method: "get",
          baseURL: repoUrl(),
        });
        this.listUnseen = res.hits.hits;

        const total = res.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.fetchingData = false;
      } catch (err) {
        this.fetchingData = false;
      }
    },
    // user
    async getCountUnseen() {
      const url = adminApi.notification.countUnseen;

      // this.httpService
      //   .getRequest(url)
      //   .then((res) => {
      //     this.countUnseen = res.count;
      //   })
      //   .catch(() => {})
      //   .finally(() => {});

      try {
        const { $api } = useNuxtApp();
        const res = await $api(url, {
          method: "get",
          baseURL: repoUrl(),
        });

        this.countUnseen = res.data.count;
      } catch (err) {}
    },
    goToNotificationShowPage(item) {
      this.$router.push({
        name: "notificationsShow",
        params: {
          id: item._id,
        },
      });
    },
    goToNotificationPage() {
      this.$router.push({
        name: "notifications",
      });
    },
    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) {
      // keep limit status.
      // reset page and offset values.

      this.pagination.page = this.pagination.offset = 0;
      this.sorting = sorting;

      this.getList();
    },
    timeSince(timeStamp) {
      var date = new Date(timeStamp * 1000);
      var seconds = Math.floor((new Date() - date) / 1000);
      var interval = seconds / 31536000;
      if (interval > 1) {
        return Math.floor(interval) + " سال";
      }
      interval = seconds / 2592000;
      if (interval > 1) {
        return Math.floor(interval) + " ماه";
      }
      interval = seconds / 86400;
      if (interval > 1) {
        return Math.floor(interval) + " روز";
      }
      interval = seconds / 3600;
      if (interval > 1) {
        return Math.floor(interval) + " ساعت";
      }
      interval = seconds / 60;
      if (interval > 1) {
        return Math.floor(interval) + " دقیقه";
      }
      return Math.floor(seconds) + " ثانیه";
    },
    async markAll() {
      let url = adminApi.notification.markAllAsRead;

      // this.httpService
      //   .postRequest(url)
      //   .then((res) => {
      //     this.getList();
      //     this.mySwalToast({
      //       html: res?.message ?? "با موفقیت تغییر یافت.",
      //     });
      //     this.numberOfMark();
      //   })
      //   .catch(() => {})
      //   .finally(() => {});

      try {
        const { $api } = useNuxtApp();
        const res = await $api(url, {
          method: "get",
          baseURL: repoUrl(),
        });
        this.getList();
        this.mySwalToast({
          html: res?.message ?? "با موفقیت تغییر یافت.",
        });
        this.numberOfMark();
      } catch (err) {}
    },
    async numberOfMark() {
      let url = adminApi.notification.counts;
      url = url.replace("{{data_type}}", this.data_type);

      // this.httpService
      //   .getRequest(url)
      //   .then((res) => {
      //     this.counts = res.data;
      //   })
      //   .catch(() => {})
      //   .finally(() => {});

      try {
        const { $api } = useNuxtApp();
        const res = await $api(url, {
          method: "get",
          baseURL: repoUrl(),
        });
        this.counts = res.data;
      } catch (err) {}
    },
  },
};