// stores/klinikRuangStore.js
import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
import { useClinicStore } from './clinicStore';

export const useKlinikRuangStore = defineStore('klinikRuang', () => {
  const clinicStore = useClinicStore();

  // State/Computed - List Master Klinik (disinkronkan dengan clinicStore)
  const masterKlinikList = computed(() => {
    const baseList = typeof clinicStore.getClinicsForDropdown === 'function'
      ? clinicStore.getClinicsForDropdown()
      : [];

    return baseList.map((c) => ({
      kode: c.kode,
      nama: c.name,
    }));
  });

  // State - Klinik Ruang Data
  const klinikRuangList = ref([
    { 
      id: 1, 
      no: 1, 
      kodeKlinik: 'AN', 
      namaKlinik: 'ANAK', 
      namaRuang: 'R. TINDAKAN',
      ruangList: [
        { nomorRuang: '1', namaRuang: 'R. TINDAKAN', nomorScreen: '101' }
      ]
    },
    { 
      id: 2, 
      no: 2, 
      kodeKlinik: 'AS', 
      namaKlinik: 'ANESTESI', 
      namaRuang: 'Ruang 1, Ruang 2, Ruang 3, Ruang 4, Ruang 5, Ruang 6',
      ruangList: [
        { nomorRuang: '1', namaRuang: 'Ruang 1', nomorScreen: '201' },
        { nomorRuang: '2', namaRuang: 'Ruang 2', nomorScreen: '202' },
        { nomorRuang: '3', namaRuang: 'Ruang 3', nomorScreen: '203' },
        { nomorRuang: '4', namaRuang: 'Ruang 4', nomorScreen: '204' },
        { nomorRuang: '5', namaRuang: 'Ruang 5', nomorScreen: '205' },
        { nomorRuang: '6', namaRuang: 'Ruang 6', nomorScreen: '206' }
      ]
    },
    { 
      id: 3, 
      no: 3, 
      kodeKlinik: 'BD', 
      namaKlinik: 'BEDAH', 
      namaRuang: 'Ruang Konsultasi',
      ruangList: [
        { nomorRuang: '1', namaRuang: 'Ruang Konsultasi', nomorScreen: '301' }
      ]
    },
    { 
      id: 4, 
      no: 4, 
      kodeKlinik: 'GR', 
      namaKlinik: 'GERIATRI', 
      namaRuang: 'Ruang Pemeriksaan',
      ruangList: [
        { nomorRuang: '1', namaRuang: 'Ruang Pemeriksaan', nomorScreen: '401' }
      ]
    },
    { 
      id: 5, 
      no: 5, 
      kodeKlinik: 'GI', 
      namaKlinik: 'GIGI DAN MULUT', 
      namaRuang: 'Ruang 1, Ruang 2, Ruang 3',
      ruangList: [
        { nomorRuang: '1', namaRuang: 'Ruang 1', nomorScreen: '501' },
        { nomorRuang: '2', namaRuang: 'Ruang 2', nomorScreen: '502' },
        { nomorRuang: '3', namaRuang: 'Ruang 3', nomorScreen: '503' }
      ]
    },
  ]);

  // Computed
  const totalKlinikRuang = computed(() => klinikRuangList.value.length);

  const totalRuangan = computed(() => {
    return klinikRuangList.value.reduce((total, klinik) => {
      return total + klinik.ruangList.length;
    }, 0);
  });

  // Get klinik by code
  const getKlinikByCode = (kode) => {
    return klinikRuangList.value.find(k => k.kodeKlinik === kode);
  };

  // Get all ruang for a specific klinik
  const getRuangByKlinik = (kodeKlinik) => {
    const klinik = klinikRuangList.value.find(k => k.kodeKlinik === kodeKlinik);
    return klinik ? klinik.ruangList : [];
  };

  // Actions - CRUD Operations

  // Create new Klinik Ruang
  const createKlinikRuang = (data) => {
    const newId = Math.max(...klinikRuangList.value.map(r => r.id), 0) + 1;
    const newNo = klinikRuangList.value.length + 1;
    
    // Generate nama ruang untuk display
    const namaRuangDisplay = data.ruangList
      .map(r => r.namaRuang)
      .filter(n => n)
      .join(', ');

    const newKlinikRuang = {
      id: newId,
      no: newNo,
      kodeKlinik: data.kodeKlinik,
      namaKlinik: data.namaKlinik,
      namaRuang: namaRuangDisplay,
      ruangList: data.ruangList
    };

    klinikRuangList.value.push(newKlinikRuang);

    return {
      success: true,
      message: `Klinik Ruang ${data.namaKlinik} berhasil ditambahkan`,
      data: newKlinikRuang
    };
  };

  // Update existing Klinik Ruang
  const updateKlinikRuang = (id, data) => {
    const index = klinikRuangList.value.findIndex(r => r.id === id);
    
    if (index === -1) {
      return {
        success: false,
        message: 'Klinik Ruang tidak ditemukan'
      };
    }

    // Generate nama ruang untuk display
    const namaRuangDisplay = data.ruangList
      .map(r => r.namaRuang)
      .filter(n => n)
      .join(', ');

    klinikRuangList.value[index] = {
      ...klinikRuangList.value[index],
      kodeKlinik: data.kodeKlinik,
      namaKlinik: data.namaKlinik,
      namaRuang: namaRuangDisplay,
      ruangList: data.ruangList
    };

    return {
      success: true,
      message: `Klinik Ruang ${data.namaKlinik} berhasil diupdate`,
      data: klinikRuangList.value[index]
    };
  };

  // Delete Klinik Ruang
  const deleteKlinikRuang = (id) => {
    const index = klinikRuangList.value.findIndex(r => r.id === id);
    
    if (index === -1) {
      return {
        success: false,
        message: 'Klinik Ruang tidak ditemukan'
      };
    }

    const deletedKlinik = klinikRuangList.value[index];
    klinikRuangList.value.splice(index, 1);

    // Reorder numbers
    klinikRuangList.value.forEach((r, idx) => {
      r.no = idx + 1;
    });

    return {
      success: true,
      message: `Klinik Ruang ${deletedKlinik.namaKlinik} berhasil dihapus`
    };
  };

  // Add ruang to existing klinik
  const addRuangToKlinik = (klinikId, ruangData) => {
    const klinik = klinikRuangList.value.find(k => k.id === klinikId);
    
    if (!klinik) {
      return {
        success: false,
        message: 'Klinik tidak ditemukan'
      };
    }

    klinik.ruangList.push(ruangData);

    // Update display name
    klinik.namaRuang = klinik.ruangList
      .map(r => r.namaRuang)
      .filter(n => n)
      .join(', ');

    return {
      success: true,
      message: `Ruang ${ruangData.namaRuang} berhasil ditambahkan`,
      data: klinik
    };
  };

  // Remove ruang from klinik
  const removeRuangFromKlinik = (klinikId, ruangIndex) => {
    const klinik = klinikRuangList.value.find(k => k.id === klinikId);
    
    if (!klinik) {
      return {
        success: false,
        message: 'Klinik tidak ditemukan'
      };
    }

    if (klinik.ruangList.length <= 1) {
      return {
        success: false,
        message: 'Minimal harus ada 1 ruangan'
      };
    }

    const removedRuang = klinik.ruangList[ruangIndex];
    klinik.ruangList.splice(ruangIndex, 1);

    // Update display name
    klinik.namaRuang = klinik.ruangList
      .map(r => r.namaRuang)
      .filter(n => n)
      .join(', ');

    return {
      success: true,
      message: `Ruang ${removedRuang.namaRuang} berhasil dihapus`,
      data: klinik
    };
  };

  // Search klinik ruang
  const searchKlinikRuang = (searchTerm) => {
    if (!searchTerm) return klinikRuangList.value;

    const term = searchTerm.toLowerCase();
    return klinikRuangList.value.filter(k => 
      k.kodeKlinik.toLowerCase().includes(term) ||
      k.namaKlinik.toLowerCase().includes(term) ||
      k.namaRuang.toLowerCase().includes(term)
    );
  };

  return {
    // State
    masterKlinikList,
    klinikRuangList,

    // Computed
    totalKlinikRuang,
    totalRuangan,

    // Getters
    getKlinikByCode,
    getRuangByKlinik,

    // Actions
    createKlinikRuang,
    updateKlinikRuang,
    deleteKlinikRuang,
    addRuangToKlinik,
    removeRuangFromKlinik,
    searchKlinikRuang,
  };
}, {
  persist: {
    key: 'klinikruang-store-state',
    storage: typeof window !== 'undefined' ? localStorage : undefined,
    paths: ['klinikRuangList'],
  },
});