import { ref } from "vue";
import { defineStore } from "pinia";
import { useCounterMixin } from "@/stores/mixin";
import { useQuasar } from "quasar";
import http from "@/plugins/http";
import config from "@/app.config";

import type { RequestObject } from "@/modules/04_registryNew/interface/request/Profile";
import type {
  DataOption,
  InformationOps,
} from "@/modules/04_registryNew/interface/index/Main";

export const useProfileDataStore = defineStore("profile", () => {
  const $q = useQuasar();
  const mixin = useCounterMixin();
  const {
    showLoader,
    hideLoader,
    date2Thai,
    messageError,
    convertDate,
    dateToISO,
  } = mixin;
  const retireDate = ref<Date>();

  const defaultProfile: RequestObject = {
    bloodGroup: null,
    relationship: null,
    gender: null,
    posTypeId: "",
    posLevelId: "",
    religion: null,
    citizenId: "",
    telephoneNumber: null,
    nationality: null,
    ethnicity: null,
    birthDate: null,
    phone: null,
    email: null,
    lastName: "",
    firstName: "",
    prefix: "",
    rank: null,
  };

  const Ops = ref<InformationOps>({
    prefixOps: [],
    rankOps: [],
    genderOps: [],
    bloodOps: [],
    statusOps: [],
    religionOps: [],
    employeeClassOps: [
      { id: "perm", name: "ลูกจ้างประจำ" },
      { id: "temp", name: "ลูกจ้างชั่วคราว" },
    ],
    employeeTypeOps: [
      { id: "gov", name: "งบประมาณเงินอุดหนุนรัฐบาล" },
      { id: "bkk", name: "งบประมาณกรุงเทพมหานคร" },
    ],
  });

  const OpsFilter = ref<InformationOps>({
    prefixOps: [],
    rankOps: [],
    genderOps: [],
    bloodOps: [],
    statusOps: [],
    religionOps: [],
    employeeClassOps: [
      { id: "perm", name: "ลูกจ้างประจำ" },
      { id: "temp", name: "ลูกจ้างชั่วคราว" },
    ],
    employeeTypeOps: [
      { id: "gov", name: "งบประมาณเงินอุดหนุนรัฐบาล" },
      { id: "bkk", name: "งบประมาณกรุงเทพมหานคร" },
    ],
  });

  const prefixOp = ref<string[]>([
    "นาย",
    "นาง",
    "นางสาว",
    "เด็กชาย",
    "เด็กหญิง",
  ]);

  function calculateAge(birthDate: Date | null) {
    if (!birthDate) return null;
    const birthDateTimeStamp = new Date(birthDate).getTime();
    const now = new Date();
    const diff = now.getTime() - birthDateTimeStamp;

    const ageDate = new Date(diff);
    const years = ageDate.getUTCFullYear() - 1970;
    const months = ageDate.getUTCMonth();
    const days = ageDate.getUTCDate() - 1;
    const retire = new Date(birthDate);
    retire.setFullYear(retire.getFullYear() + 60);
    retireDate.value = retire

    if (years > 60) {
      return "อายุเกิน 60 ปี";
    }

    return `${years} ปี ${months} เดือน ${days} วัน`;
  }

  const fetchPerson = async () => {
    showLoader();
    await http
      .get(config.API.profileNewMetaMain)
      .then((res) => {
        const data = res.data.result;
        let optionbloodGroups: DataOption[] = [];
        data.bloodGroups.map((r: any) => {
          optionbloodGroups.push({
            id: r.id.toString(),
            name: r.name.toString(),
          });
        });
        Ops.value.bloodOps = optionbloodGroups;
        OpsFilter.value.bloodOps = optionbloodGroups;

        let optiongenders: DataOption[] = [];
        data.genders.map((r: any) => {
          optiongenders.push({
            id: r.id.toString(),
            name: r.name.toString(),
          });
        });
        Ops.value.genderOps = optiongenders;
        OpsFilter.value.genderOps = optiongenders;

        let optionprefixs: DataOption[] = [];
        data.prefixs.map((r: any) => {
          optionprefixs.push({
            id: r.id.toString(),
            name: r.name.toString(),
          });
        });
        Ops.value.prefixOps = optionprefixs;
        OpsFilter.value.prefixOps = optionprefixs;

        let optionrank: DataOption[] = [];
        data.rank.map((r: any) => {
          optionrank.push({
            id: r.id.toString(),
            name: r.name.toString(),
          });
        });
        Ops.value.rankOps = optionrank;
        OpsFilter.value.rankOps = optionrank;

        let optionrelationships: DataOption[] = [];
        data.relationships.map((r: any) => {
          optionrelationships.push({
            id: r.id.toString(),
            name: r.name.toString(),
          });
        });
        Ops.value.statusOps = optionrelationships;
        OpsFilter.value.statusOps = optionrelationships;

        let optionreligions: DataOption[] = [];
        data.religions.map((r: any) => {
          optionreligions.push({
            id: r.id.toString(),
            name: r.name.toString(),
          });
        });
        Ops.value.religionOps = optionreligions;
        OpsFilter.value.religionOps = optionreligions;
      })
      .catch((e: any) => {})
      .finally(() => {
        hideLoader();
      });
  };

  const filterSelector = (val: any, update: Function, refData: string) => {
    switch (refData) {
      case "prefixOps":
        update(() => {
          Ops.value.prefixOps = OpsFilter.value.prefixOps.filter(
            (v: DataOption) => v.name.indexOf(val) > -1
          );
        });
        break;
      case "rankOps":
        update(() => {
          Ops.value.rankOps = OpsFilter.value.rankOps.filter(
            (v: DataOption) => v.name.indexOf(val) > -1
          );
        });
        break;
      case "genderOps":
        update(() => {
          Ops.value.genderOps = OpsFilter.value.genderOps.filter(
            (v: DataOption) => v.name.indexOf(val) > -1
          );
        });
        break;
      case "bloodOps":
        update(() => {
          Ops.value.bloodOps = OpsFilter.value.bloodOps.filter(
            (v: DataOption) => v.name.indexOf(val) > -1
          );
        });
        break;
      case "statusOps":
        update(() => {
          Ops.value.statusOps = OpsFilter.value.statusOps.filter(
            (v: DataOption) => v.name.indexOf(val) > -1
          );
        });
        break;
      case "religionOps":
        update(() => {
          Ops.value.religionOps = OpsFilter.value.religionOps.filter(
            (v: DataOption) => v.name.indexOf(val) > -1
          );
        });
        break;
      case "employeeClassOps":
        update(() => {
          Ops.value.employeeClassOps = OpsFilter.value.employeeClassOps.filter(
            (v: DataOption) => v.name.indexOf(val) > -1
          );
        });
        break;
      case "employeeTypeOps":
        update(() => {
          Ops.value.employeeTypeOps = OpsFilter.value.employeeTypeOps.filter(
            (v: DataOption) => v.name.indexOf(val) > -1
          );
        });
        break;

      default:
        break;
    }
  };

  return {
    defaultProfile,
    retireDate,
    Ops,
    OpsFilter,

    calculateAge,
    fetchPerson,
    filterSelector,
  };
});
