import { defineStore } from 'pinia';
import spesialisData from '~/data/mock/spesialis.json';
import subSpesialisData from '~/data/mock/subSpesialis.json';
import api from '~/services/api';
import type { Dokter, DiagnosisItem, TindakanItem } from '~/types/pendaftaran';

interface FormData {
    noRekamMedis: string;
    noKtp: string;
    namaPasien: string;
    jenisKelamin: string;
    tanggalLahir: string;
    umur: string;
    alamat: string;
    nomorTelepon: string[];
}

interface RencanaOperasiData {
    spesialis: number | null | undefined;
    subSpesialis: number | null | undefined;
    tanggalDaftar: string;
    kategoriOperasi: number | null | undefined;
    rencanaOperasi: string;
    keterangan: string;
}

interface StatusPasienData {
    tanggalSelesai: string;
    statusOperasi: string;
    keteranganStatus: string;
}

export const usePendaftaranStore = defineStore('pendaftaran', {
    state: () => ({
        // Form data
        formData: {
            noRekamMedis: '',
            noKtp: '',
            namaPasien: '',
            jenisKelamin: '',
            tanggalLahir: '',
            umur: '',
            alamat: '',
            nomorTelepon: []
        } as FormData,

        // Medical data
        diagnosisItems: [] as DiagnosisItem[],
        tindakanItems: [] as TindakanItem[],

        // Rencana Operasi data
        rencanaOperasiData: {
            spesialis: null as number | null | undefined,
            subSpesialis: null as number | null | undefined,
            tanggalDaftar: '',
            kategoriOperasi: null as number | null | undefined,
            rencanaOperasi: '',
            keterangan: ''
        } as RencanaOperasiData,

        dokterPelaksanaItems: [] as Dokter[],

        // Status Pasien data
        statusPasienData: {
            tanggalSelesai: '',
            statusOperasi: 'Belum',
            keteranganStatus: ''
        } as StatusPasienData,

        // UI state
        loading: false,
        snackbar: false,
        snackbarMessage: '',
        snackbarColor: 'error'
    }),

    getters: {
        // Check if form has any data
        hasFormData: (state) => {
            return !!(
                state.formData.noRekamMedis ||
                state.formData.namaPasien ||
                state.diagnosisItems.length > 0 ||
                state.tindakanItems.length > 0 ||
                state.rencanaOperasiData.spesialis ||
                state.dokterPelaksanaItems.length > 0
            );
        },

        // Get all form data for submission
        getSubmissionData: (state) => {
            return {
                formData: state.formData,
                diagnosisItems: state.diagnosisItems,
                tindakanItems: state.tindakanItems,
                rencanaOperasiData: state.rencanaOperasiData,
                dokterPelaksanaItems: state.dokterPelaksanaItems,
                statusPasienData: state.statusPasienData
            };
        }
    },

    actions: {
        // Initialize form with query parameters
        async initializeFromQuery(kodeSpesialis?: string, kodeSubSpesialis?: string) {
            if (kodeSpesialis) {
                const spesialis = spesialisData.find(s => s.kode === kodeSpesialis);
                if (spesialis) {
                    this.rencanaOperasiData.spesialis = spesialis.id;

                    // Wait for next tick to ensure watch has processed
                    if (kodeSubSpesialis) {
                        await nextTick();
                        const subSpesialis = subSpesialisData.find(s => s.kode === kodeSubSpesialis);
                        if (subSpesialis) {
                            this.rencanaOperasiData.subSpesialis = subSpesialis.id;
                        }
                    }
                }
            }
        },

        // Reset entire form
        resetForm() {
            this.formData = {
                noRekamMedis: '',
                noKtp: '',
                namaPasien: '',
                jenisKelamin: '',
                tanggalLahir: '',
                umur: '',
                alamat: '',
                nomorTelepon: []
            };

            this.diagnosisItems = [];
            this.tindakanItems = [];

            this.rencanaOperasiData = {
                spesialis: null,
                subSpesialis: null,
                tanggalDaftar: '',
                kategoriOperasi: null,
                rencanaOperasi: '',
                keterangan: ''
            };

            this.dokterPelaksanaItems = [];

            this.statusPasienData = {
                tanggalSelesai: '',
                statusOperasi: 'Belum',
                keteranganStatus: ''
            };
        },

        // Validate form data
        validateForm(): { valid: boolean; errors: string[] } {
            const errors: string[] = [];

            // Validate formData
            if (!this.formData.noRekamMedis) {
                errors.push('No Rekam Medis');
            }

            // Validate rencanaOperasiData
            if (!this.rencanaOperasiData.spesialis) {
                errors.push('Spesialis');
            }
            if (!this.rencanaOperasiData.subSpesialis) {
                errors.push('Sub Spesialis');
            }
            if (!this.rencanaOperasiData.tanggalDaftar) {
                errors.push('Tanggal Daftar');
            }
            if (!this.rencanaOperasiData.kategoriOperasi) {
                errors.push('Kategori Operasi');
            }

            // Validate status operasi
            if (!this.statusPasienData.statusOperasi) {
                errors.push('Status Operasi');
            }

            // Conditional validation based on status operasi
            if (this.statusPasienData.statusOperasi === 'Selesai') {
                if (!this.statusPasienData.tanggalSelesai) {
                    errors.push('Tanggal Selesai Operasi (wajib diisi untuk status Selesai)');
                } else if (this.rencanaOperasiData.tanggalDaftar && 
                           this.statusPasienData.tanggalSelesai < this.rencanaOperasiData.tanggalDaftar) {
                    errors.push('Tanggal Selesai Operasi tidak boleh kurang dari Tanggal Daftar');
                }
            }

            if (this.statusPasienData.statusOperasi === 'Tunda' || this.statusPasienData.statusOperasi === 'Batal') {
                if (!this.statusPasienData.keteranganStatus) {
                    errors.push('Keterangan Status Pasien (wajib diisi untuk status Tunda/Batal)');
                }
            }

            return {
                valid: errors.length === 0,
                errors
            };
        },

        // Submit form
        async submitForm() {
            this.loading = true;
            try {
                // Prepare submission data
                const submissionData = {
                    formData: this.formData,
                    diagnosisItems: this.diagnosisItems,
                    tindakanItems: this.tindakanItems,
                    rencanaOperasiData: {
                        ...this.rencanaOperasiData,
                        // Convert tanggalDaftar to ISO format if needed
                        tanggalDaftar: this.rencanaOperasiData.tanggalDaftar 
                            ? new Date(this.rencanaOperasiData.tanggalDaftar).toISOString()
                            : ''
                    },
                    dokterPelaksanaItems: this.dokterPelaksanaItems.map(dokter => ({
                        id: dokter.id,
                        nip: dokter.nip,
                        nama: dokter.nama_lengkap
                    })),
                    statusPasienData: {
                        ...this.statusPasienData,
                        // Convert tanggalSelesai to ISO format or null
                        tanggalSelesai: this.statusPasienData.tanggalSelesai 
                            ? new Date(this.statusPasienData.tanggalSelesai).toISOString()
                            : null
                    }
                };

                console.log('Submitting data:', submissionData);

                // Make API call
                const response = await api.post('/antrian-operasi', submissionData);

                console.log('API Response:', response.data);

                // Show success message
                this.showSnackbar('Data berhasil disimpan!', 'success');

                return { success: true, data: response.data };
            } catch (error: any) {
                console.error('Error submitting form:', error);
                
                // Handle error message
                const errorMessage = error.response?.data?.message 
                    || error.message 
                    || 'Terjadi kesalahan saat menyimpan data!';
                
                this.showSnackbar(errorMessage, 'error');
                return { success: false, error };
            } finally {
                this.loading = false;
            }
        },

        // Show snackbar notification
        showSnackbar(message: string, color: string = 'error') {
            this.snackbarMessage = message;
            this.snackbarColor = color;
            this.snackbar = true;
        },

        // Close snackbar
        closeSnackbar() {
            this.snackbar = false;
        }
    }
});
