import { fetchWrapper } from "@/shared/fetchWrapper";
import { genderOptions } from "@/pages/newMedicalCard/utils/medicalConfig";
import { getConfidantObject } from "@/pages/newMedicalCard/utils/gettersObjects";

const state = () => ({
  medicalCard: {},
  confidantData: [],
  personFiltredList: [],
  contactsData: {
    phones: [],
    emails: [],
    networks: [],
  },
  basicData: {
    personalData: {
      last_name: null,
      first_name: null,
      patronymic: null,
      gender: null,
      birth_date: null,
      photo: null,
    },
    registrationAddress: {
      region: null,
      city: null,
      street: null,
      house_number: null,
      apartment_number: null,
    },
    residenceAddress: {
      region: null,
      city: null,
      street: null,
      house_number: null,
      apartment_number: null,
    },
    insuranceDMS: {
      series: null,
      number: null,
      photo: null,
      id: null,
      organization: null,
    },
    insuranceOMS: {
      series: null,
      number: null,
      photo: null,
      id: null,
      organization: null,
    },
    benefit: {
      id: null,
      discount: null,
      name: null,
      photo: null,
    },
  },
  documents: {},
  allergies: [],
  avatar: "",
  benefitData: [],
});

const getters = {
  getBasicData(state, rootState) {
    let registrationAddress =
      state.medicalCard?.person?.address?.find((el) => el.registration_flg) ||
      {};
    let residenceAddress =
      state?.medicalCard?.person?.address?.find((el) => el.residence_flg) || {};
    let person = state.medicalCard.person;
    let OMS = person?.insurance_policy?.find((e) => e.title === "OMS");
    let DMS = person?.insurance_policy?.find((e) => e.title === "DMS");
    return {
      personalData: {
        last_name: person?.last_name || "",
        first_name: person?.first_name || "",
        patronymic: person?.patronymic || "",
        gender:
          (person?.gender &&
            genderOptions.find((el) => el.id === person?.gender)) ||
          "",
        birth_date: person?.birth_date ? new Date(person?.birth_date) : "",
        photo: person?.photo
          ? {
              photo: rootState.getUrl + person.photo,
              file: null,
            }
          : {},
        id: person?.id,
      },
      registrationAddress: {
        region: registrationAddress?.region || "",
        city: registrationAddress?.city || "",
        street: registrationAddress?.street || "",
        house_number: registrationAddress?.house_number || "",
        apartment_number: registrationAddress?.apartment_number || "",
        id: registrationAddress?.id || "",
      },
      residenceAddress: {
        region: residenceAddress?.region || "",
        city: residenceAddress?.city || "",
        street: residenceAddress?.street || "",
        house_number: residenceAddress?.house_number || "",
        apartment_number: residenceAddress?.apartment_number || "",
        id: residenceAddress?.id || "",
      },
      insuranceDMS: {
        series: DMS?.series,
        number: DMS?.number,
        photo: DMS?.photo
          ? {
              photo: rootState.getUrl + DMS?.photo,
              file: null,
            }
          : {},
        id: DMS?.id,
        organization: DMS?.organization,
      },
      insuranceOMS: {
        series: OMS?.series,
        number: OMS?.number,
        photo: OMS?.photo
          ? {
              photo: rootState.getUrl + OMS?.photo,
              file: null,
            }
          : {},
        id: OMS?.id,
        organization: OMS?.organization,
      },
      benefit: {
        name: person?.benefit?.name,
        id: person?.benefit?.id,
        discount: person?.benefit?.discount,
        photo: person?.photo_benefit
          ? {
              photo: rootState.getUrl + person?.photo_benefit,
              file: null,
            }
          : {},
      },
    };
  },
  getDocumentsData(state, rootState) {
    let person = state.medicalCard?.person;
    const passport = person?.identity_document.find(
      (el) => el.kind === "PASSPORT"
    );
    return {
      passport: {
        id: passport?.id ?? "",
        series: passport?.series ?? "",
        number: passport?.number ?? "",
        issued_by_org: passport?.issued_by_org ?? "",
        issued_by_org_code: passport?.issued_by_org_code ?? "",
        issued_by_date: passport?.issued_by_date
          ? new Date(passport?.issued_by_date)
          : null,
        photo: passport?.photo
          ? {
              photo: rootState.getUrl + passport.photo,
              file: null,
            }
          : {},
      },
      insurance_number: {
        insurance_number: person?.insurance_number ?? "",
        photo_insurance_number: person?.photo_insurance_number
          ? {
              photo: rootState.getUrl + person.photo_insurance_number,
              file: null,
            }
          : {},
      },
      tax_identification_number: {
        tax_identification_number: person?.tax_identification_number ?? "",
        photo_tax_identification_number: person?.photo_tax_identification_number
          ? {
              photo: rootState.getUrl + person?.photo_tax_identification_number,
              file: null,
            }
          : {},
      },
    };
  },
  getContactsData(state) {
    let phones = state.medicalCard.person.contacts
      .filter((el) => el.kind === "PHONE")
      .map((el) => ({ ...el }));
    let emails = state.medicalCard.person.contacts
      .filter((el) => el.kind === "EMAIL")
      .map((el) => ({ ...el }));
    let networks = state.medicalCard.person.contacts
      .filter((el) => el.kind !== "PHONE" && el.kind !== "EMAIL")
      .map((el) => ({ ...el }));
    return {
      phones: [...phones],
      emails: [...emails],
      networks: [...networks],
    };
  },
  getAllergiesData(state) {
    return [...state.medicalCard.person.allergic.map((el) => ({ ...el }))];
  },
  getConfidantData(state) {
    return [...state.medicalCard.confidant.map((el) => getConfidantObject(el))];
  },
  getAvatar(state) {
    let lastName = state?.medicalCard?.person?.last_name;
    let firstName = state?.medicalCard?.person?.first_name;
    return lastName?.[0] + firstName?.[0];
  },
};

const actions = {
  getBenefitData({ commit }) {
    fetchWrapper.get("general/benefit/").then((res) => {
      commit("setBenefitData", res.results);
    });
  },
  getBenefitDataSearch({ commit }) {
    fetchWrapper
      .get(`general/benefit/?name=${localStorage.getItem("searchBenefit")}`)
      .then((res) => {
        commit("setBenefitData", res.results);
      });
  },

  getMedicalCardData({ commit }) {
    fetchWrapper
      .get(
        `medical_card/medical_history/${localStorage.getItem(
          "medicalId"
        )}/detail/`
      )
      .then((res) => {
        commit("setMedicalCard", res);
        commit("setBasicData");
        commit("setContactsData");
        commit("setDocumentsData");
        commit("setAllergiesData");
        commit("setConfidantData");
      });
  },
  getPersonsFiltredList() {
    return fetchWrapper
      .get(
        `general/person/?last_name=${localStorage.getItem("searchConfidant")}`
      )
      .then((res) => res.results);
  },
  returnInitData({ commit }) {
    commit("setBasicData");
    commit("setContactsData");
    commit("setAllergiesData");
    commit("setConfidantData");
  },
  removeMedicalCardData({ commit, rootState }) {
    fetchWrapper
      .del(
        `medical_card/medical_history/${localStorage.getItem(
          "medicalId"
        )}/delete/`
      )
      .then(() => {
        rootState.routingHistory.back();
        commit("setMedicalCard", {});
        localStorage.removeItem("medicalId");
      });
  },
};

const mutations = {
  setBenefitData(state, data) {
    state.benefitData = data;
  },
  setMedicalCard(state, card) {
    state.medicalCard = card;
  },
  setBasicData(state) {
    state.basicData = { ...this.getters.getBasicData };
  },
  setContactsData(state) {
    state.contactsData = { ...this.getters.getContactsData };
  },
  setDocumentsData(state) {
    state.documents = { ...this.getters.getDocumentsData };
  },
  setAllergiesData(state) {
    state.allergies = this.getters.getAllergiesData;
  },
  setConfidantData(state) {
    state.confidantData = this.getters.getConfidantData;
  },
  setPersonFiltredList(state, persons) {
    state.personFiltredList = persons;
  },
};

export default {
  state,
  getters,
  actions,
  mutations,
};
