"use client";

import { useState, useEffect, useCallback } from "react";

export interface SchoolOfficial {
  id: string; // 'kepala_sekolah' | 'wakasek_kurikulum' | 'wakasek_kesiswaan' | 'wakasek_sarana' | 'wakasek_humas' | 'koordinator_bk'
  title: string;
  role_name: string;
  name: string;
  nip: string;
  is_active?: number;
  signature_image?: string | null;
  stamp_image?: string | null;
}

export const DEFAULT_OFFICIALS: Record<string, SchoolOfficial> = {
  kepala_sekolah: {
    id: "kepala_sekolah",
    title: "Kepala SMA BPI 1 Bandung",
    role_name: "Kepala Sekolah",
    name: "Tatang, M.Pd.",
    nip: "NIPY. 10079",
  },
  wakasek_kurikulum: {
    id: "wakasek_kurikulum",
    title: "Wakasek Bidang Kurikulum",
    role_name: "Wakasek Kurikulum",
    name: "Cucu Hidayat, S.Pd.",
    nip: "NIPY. 10085",
  },
  wakasek_kesiswaan: {
    id: "wakasek_kesiswaan",
    title: "Wakasek Bidang Kesiswaan",
    role_name: "Wakasek Kesiswaan",
    name: "Tim Kesiswaan",
    nip: "Koordinator Kedisiplinan Siswa",
  },
  wakasek_sarana: {
    id: "wakasek_sarana",
    title: "Wakasek Bidang Sarana & Prasarana",
    role_name: "Wakasek Sarana",
    name: "Drs. Budi Santoso",
    nip: "NIPY. 10064",
  },
  wakasek_humas: {
    id: "wakasek_humas",
    title: "Wakasek Bidang Humas",
    role_name: "Wakasek Humas",
    name: "Muhammad Irfan Triawan, M.Pd",
    nip: "NIPY. 10072",
  },
  koordinator_bk: {
    id: "koordinator_bk",
    title: "Koordinator Bimbingan & Konseling (BK)",
    role_name: "Koordinator BK",
    name: "Dra. Euis Kurniasih",
    nip: "NIPY. 10058",
  },
  koordinator_lab_bahasa: {
    id: "koordinator_lab_bahasa",
    title: "Koordinator Laboratorium Bahasa",
    role_name: "Koordinator Lab Bahasa",
    name: "Taufik Hidayat, S.Pd., M.A.",
    nip: "NIPY. 10092",
  },
  kepala_tata_usaha: {
    id: "kepala_tata_usaha",
    title: "Kepala Tata Usaha",
    role_name: "Kepala Tata Usaha",
    name: "Dra. Hj. Lilis Suryani",
    nip: "NIPY. 10042",
  },
};

export function useSchoolOfficials() {
  const [officialsMap, setOfficialsMap] = useState<Record<string, SchoolOfficial>>(DEFAULT_OFFICIALS);
  const [officialsList, setOfficialsList] = useState<SchoolOfficial[]>(Object.values(DEFAULT_OFFICIALS));
  const [isLoading, setIsLoading] = useState<boolean>(true);

  const fetchOfficials = useCallback(async () => {
    try {
      const res = await fetch("/api/school-officials");
      const json = await res.json();
      if (json.success && json.data) {
        const map: Record<string, SchoolOfficial> = { ...DEFAULT_OFFICIALS, ...json.map };
        setOfficialsMap(map);
        setOfficialsList(json.data);
      }
    } catch (err) {
      console.error("Gagal memuat pejabat sekolah:", err);
    } finally {
      setIsLoading(false);
    }
  }, []);

  useEffect(() => {
    fetchOfficials();
  }, [fetchOfficials]);

  const updateOfficial = async (id: string, data: Partial<SchoolOfficial>): Promise<boolean> => {
    try {
      const res = await fetch("/api/school-officials", {
        method: "PUT",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ id, ...data }),
      });
      const json = await res.json();
      if (json.success) {
        await fetchOfficials();
        return true;
      }
      return false;
    } catch (err) {
      console.error("Gagal memperbarui pejabat:", err);
      return false;
    }
  };

  const bulkUpdateOfficials = async (officials: Partial<SchoolOfficial>[]): Promise<boolean> => {
    try {
      const res = await fetch("/api/school-officials", {
        method: "PUT",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(officials),
      });
      const json = await res.json();
      if (json.success) {
        await fetchOfficials();
        return true;
      }
      return false;
    } catch (err) {
      console.error("Gagal update pejabat massal:", err);
      return false;
    }
  };

  const getOfficial = (id: string): SchoolOfficial => {
    return officialsMap[id] || DEFAULT_OFFICIALS[id] || {
      id,
      title: id,
      role_name: id,
      name: "-",
      nip: "-",
    };
  };

  return {
    officials: officialsList,
    officialsMap,
    getOfficial,
    updateOfficial,
    bulkUpdateOfficials,
    refreshOfficials: fetchOfficials,
    isLoading,
  };
}
