// ملف التخزين (Store):
// src/stores/verificationRequest.ts
import { defineStore } from 'pinia';
import {
  HomeData,
  Step1Data,
  Step2Data,
  Step3Data,
  Step4Data,
  Step5Data,
  Step6Data,
  RequestData,
  ValidationResult,
  FormData
} from '../data/types';
import { createDocumentResource } from 'frappe-ui';
import { ref } from 'vue';
import { createRequestList, updateFieldsInRequestList, getDocumentResource } from '../data/request';
import { useToast } from 'vue-toastification';

interface StepValidation {
  validation: ValidationResult;
}

interface VerificationRequestStoreState {
  documentName: string | null;
  home: HomeData;
  step1: Step1Data;
  step2: Step2Data;
  step3: Step3Data;
  step4: Step4Data;
  step5: Step5Data;
  step6: Step6Data;
  validations: StepValidation[];
}

const getDefaultState = (): VerificationRequestStoreState => ({
  documentName: null,
  home: {
    country: { value: '', isValid: false, validationMessage: '' },
    mobile_number: { value: '', isValid: false, validationMessage: '' },
    is_degree_or_diploma: { value: false, isValid: false, validationMessage: '' },
    from_time: { value: '', isValid: true, validationMessage: '' },
    to_time: { value: '', isValid: false, validationMessage: '' },
  },
  step1: {
    employer_name: { value: '', isValid: false, validationMessage: '' },
    first_name: { value: '', isValid: false, validationMessage: '' },
    last_name: { value: '', isValid: false, validationMessage: '' },
    middle_name: { value: '', isValid: true, validationMessage: '' },
    suffix: { value: '', isValid: true, validationMessage: '' },
    alias_name: { value: '', isValid: true, validationMessage: '' },
  },
  step2: {
    education_information: [],
  },
  step3: {
    employment_history: [],
  },
  step4: {
    professional_qualification: [],
  },
  step5: {
    review_comments: { value: '', isValid: true, validationMessage: '' },
  },
  step6: {
    full_name: { value: '', isValid: false, validationMessage: '' },
    email_address: { value: '', isValid: false, validationMessage: '' },
    other_languages: { value: [], isValid: true, validationMessage: '' },
    electronic_signature: { value: '', isValid: false, validationMessage: '' },
    i_agree_to_the_electronic_signature: { value: false, isValid: false, validationMessage: '' },
    i_acknowledge_the_above: { value: false, isValid: false, validationMessage: '' },
  },
  validations: Array.from({ length: 6 }, () => ({ validation: {} })),
});

export const useVerificationRequestStore = defineStore('verificationRequest', {
  state: (): VerificationRequestStoreState => getDefaultState(),

  actions: {
    // تعيين اسم الوثيقة
    setDocumentName(name: string) {
      this.documentName = name;
    },

    // دالة عامة لتحديث أي خطوة
    updateStep<T extends keyof VerificationRequestStoreState>(
      step: T,
      data: Partial<VerificationRequestStoreState[T]>
    ) {
      this[step] = { ...this[step], ...data };
    },

    // دالة لتحديث نتائج التحقق لخطوة معينة
    updateValidation(stepIndex: number, validation: ValidationResult) {
      if (stepIndex >= 0 && stepIndex < this.validations.length) {
        this.validations[stepIndex].validation = validation;
      }
    },

    // إعادة تعيين الستور إلى الحالة الافتراضية
    resetStore() {
      Object.assign(this, getDefaultState());
    },

    // دالة عامة لتحديث حقل معين في أي خطوة (بما في ذلك Home)
    updateField<T extends keyof VerificationRequestStoreState, K extends keyof VerificationRequestStoreState[T]>(
      step: T,
      field: K,
      value: VerificationRequestStoreState[T][K]['value']
    ) {
      if (this[step][field]) {
        this[step][field].value = value;
        // يمكنك إضافة منطق للتحقق من صحة الحقل هنا إذا لزم الأمر
      }
    },

    /**
     * تحميل بيانات الوثيقة الحالية أو إنشاء جديدة إذا لم تكن موجودة
     */
    async loadDocument() {
      const toast = useToast();
      const requestList = createRequestList(['name', 'user_id']);

      try {
        // انتظار جلب البيانات
        await requestList.fetch();

        if (requestList.data.length > 0) {
          this.documentName = requestList.data[0].name;
          toast.success("تم تحميل الوثيقة بنجاح.");
        } else {
          // لا توجد وثيقة، يمكن إنشاء واحدة جديدة أو معالجة الحالة حسب الحاجة
          this.documentName = null;
          toast.info("لا توجد وثيقة متاحة. يرجى إنشاء واحدة جديدة.");
        }
      } catch (error) {
        console.error("Error loading document:", error);
        toast.error("حدث خطأ أثناء تحميل الوثيقة.");
      }
    },

    /**
     * تحديث حقل معين في الوثيقة الحالية
     */
    async updateDocumentFields(updatedFields: UpdateFields) {
      const toast = useToast();

      if (!this.documentName) {
        toast.error("لم يتم العثور على اسم الوثيقة. يرجى إنشاء وثيقة أولاً.");
        return;
      }

      const requestList = createRequestList(['name', 'user_id']);

      try {
        await updateFieldsInRequestList(requestList, updatedFields);
        toast.success("تم تحديث الوثيقة بنجاح.");
      } catch (error) {
        console.error("Error updating document fields:", error);
        toast.error("حدث خطأ أثناء تحديث الوثيقة.");
      }
    },

    /**
     * إنشاء وثيقة جديدة
     */
    async createDocument(data: RequestData) {
      const toast = useToast();
      try {
        await createDocument(data);
        this.documentName = data.name;
        toast.success("تم إنشاء الوثيقة بنجاح.");
      } catch (error) {
        console.error("Error creating document:", error);
        toast.error("حدث خطأ أثناء إنشاء الوثيقة.");
      }
    },

    /**
     * تحديث الوثيقة الحالية بكامل البيانات
     */
    async updateDocument(data: Partial<RequestData>) {
      const toast = useToast();

      if (!this.documentName) {
        toast.error("لم يتم العثور على اسم الوثيقة. يرجى إنشاء وثيقة أولاً.");
        return;
      }

      try {
        await updateDocument(data);
        toast.success("تم تحديث الوثيقة بنجاح.");
      } catch (error) {
        console.error("Error updating document:", error);
        toast.error("حدث خطأ أثناء تحديث الوثيقة.");
      }
    },
  },
});