function InstitutionManager() {
    const [institutions, setInstitutions] = React.useState([]);
    const [loading, setLoading] = React.useState(true);
    const [error, setError] = React.useState(null);
    const [formData, setFormData] = React.useState({ nama: '' });
    const [editingId, setEditingId] = React.useState(null);
    const [importing, setImporting] = React.useState(false);
    const [selectedIds, setSelectedIds] = React.useState([]);
    
    // Hidden file input ref
    const fileInputRef = React.useRef(null);

    const fetchInstitutions = async () => {
        setLoading(true);
        setError(null);
        try {
            const client = window.SupabaseUtils.getClient();
            if (!client) throw new Error("Koneksi database terputus");

            const { data, error } = await client
                .from('institutions')
                .select('*')
                .order('nama', { ascending: true });
            
            if (error) {
                if (error.code === '42P01') {
                    throw new Error("Tabel 'institutions' belum dibuat. Silakan cek menu Pengaturan atau SQL Setup.");
                }
                throw error;
            }
            setInstitutions(data || []);
        } catch (err) {
            console.error("Fetch Error:", err);
            setError(window.SupabaseUtils.formatError(err));
        } finally {
            setLoading(false);
        }
    };

    React.useEffect(() => {
        fetchInstitutions();
    }, []);

    const handleSubmit = async (e) => {
        e.preventDefault();
        if (!formData.nama.trim()) return;

        try {
            const client = window.SupabaseUtils.getClient();
            
            if (editingId) {
                const { error } = await client
                    .from('institutions')
                    .update({ nama: formData.nama })
                    .eq('id', editingId);
                if (error) throw error;
            } else {
                const { error } = await client
                    .from('institutions')
                    .insert([{ nama: formData.nama }]);
                if (error) throw error;
            }

            setFormData({ nama: '' });
            setEditingId(null);
            fetchInstitutions();
            Swal.fire({
                icon: 'success',
                title: 'Berhasil',
                text: 'Data lembaga berhasil disimpan',
                timer: 1500,
                showConfirmButton: false
            });
        } catch (err) {
            Swal.fire("Gagal!", "Gagal menyimpan: " + window.SupabaseUtils.formatError(err), "error");
        }
    };

    const handleEdit = (inst) => {
        setFormData({ nama: inst.nama });
        setEditingId(inst.id);
    };

    const handleDelete = async (id) => {
        const result = await Swal.fire({
            title: "Hapus Lembaga?",
            text: "Tindakan ini tidak dapat dibatalkan.",
            icon: "warning",
            showCancelButton: true,
            confirmButtonColor: "#d33",
            cancelButtonColor: "#3085d6",
            confirmButtonText: "Ya, Hapus!",
            cancelButtonText: "Batal"
        });

        if (!result.isConfirmed) return;

        try {
            const client = window.SupabaseUtils.getClient();
            const { error } = await client.from('institutions').delete().eq('id', id);
            if (error) throw error;
            fetchInstitutions();
            Swal.fire("Terhapus!", "Lembaga telah dihapus.", "success");
        } catch (err) {
            Swal.fire("Gagal!", "Gagal menghapus: " + window.SupabaseUtils.formatError(err), "error");
        }
    };

    const handleCancel = () => {
        setFormData({ nama: '' });
        setEditingId(null);
    };

    const handleSelectAll = (e) => {
        if (e.target.checked) {
            setSelectedIds(institutions.map(i => i.id));
        } else {
            setSelectedIds([]);
        }
    };

    const handleSelectOne = (id) => {
        setSelectedIds(prev => 
            prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id]
        );
    };

    const handleBulkDelete = async () => {
        if (selectedIds.length === 0) return;

        const result = await Swal.fire({
            title: `Hapus ${selectedIds.length} Lembaga?`,
            text: "Data yang dihapus tidak dapat dikembalikan! Pastikan tidak ada data pegawai yang terhubung ke lembaga ini.",
            icon: "warning",
            showCancelButton: true,
            confirmButtonColor: "#d33",
            cancelButtonColor: "#3085d6",
            confirmButtonText: "Ya, Hapus Semua!",
            cancelButtonText: "Batal"
        });

        if (!result.isConfirmed) return;

        try {
            const client = window.SupabaseUtils.getClient();
            const { error } = await client
                .from('institutions')
                .delete()
                .in('id', selectedIds);
            
            if (error) throw error;
            
            setSelectedIds([]);
            fetchInstitutions();
            Swal.fire("Terhapus!", "Data terpilih telah dihapus.", "success");
        } catch (err) {
            Swal.fire("Gagal!", "Gagal menghapus: " + window.SupabaseUtils.formatError(err), "error");
        }
    };

    // --- Excel Features ---

    const handleExportExcel = () => {
        try {
            if (institutions.length === 0) {
                Swal.fire("Data Kosong", "Belum ada data lembaga untuk diexport.", "info");
                return;
            }

            const wb = XLSX.utils.book_new();
            const header = ["No", "Nama Lembaga", "ID Sistem"];
            const rows = institutions.map((inst, i) => [
                i + 1, inst.nama, inst.id
            ]);

            const ws = XLSX.utils.aoa_to_sheet([header, ...rows]);
            ws['!cols'] = [{wch: 5}, {wch: 40}, {wch: 40}];
            XLSX.utils.book_append_sheet(wb, ws, "Data Lembaga");

            XLSX.writeFile(wb, `Master_Lembaga_PP_Karangasem_${new Date().toISOString().split('T')[0]}.xlsx`);
            Swal.fire("Sukses", "Data berhasil diexport.", "success");
        } catch (err) {
            console.error(err);
            Swal.fire("Error", "Gagal export data.", "error");
        }
    };

    const handleDownloadTemplate = () => {
        try {
            const wb = XLSX.utils.book_new();
            const header = ["Nama Lembaga"];
            const examples = [
                ["MAM 1 Paciran"],
                ["SMAM 6 Paciran"],
                ["SMPM 14 Paciran"],
                ["(Tulis nama lembaga baru dibawah sini...)"]
            ];

            const ws = XLSX.utils.aoa_to_sheet([header, ...examples]);
            ws['!cols'] = [{wch: 40}];
            XLSX.utils.book_append_sheet(wb, ws, "Template Import");

            XLSX.writeFile(wb, "Template_Import_Lembaga.xlsx");
        } catch (err) {
            Swal.fire("Error", "Gagal download template.", "error");
        }
    };

    const handleFileSelect = (e) => {
        const file = e.target.files[0];
        if (file) {
            processImport(file);
        }
        // Reset input
        e.target.value = ''; 
    };

    const processImport = (file) => {
        const reader = new FileReader();
        reader.onload = async (e) => {
            setImporting(true);
            try {
                const data = new Uint8Array(e.target.result);
                const workbook = XLSX.read(data, { type: 'array' });
                const firstSheet = workbook.SheetNames[0];
                const worksheet = workbook.Sheets[firstSheet];
                const jsonData = XLSX.utils.sheet_to_json(worksheet, { defval: "" });

                if (jsonData.length === 0) {
                    throw new Error("File kosong atau format tidak sesuai.");
                }

                const client = window.SupabaseUtils.getClient();
                let successCount = 0;
                let failCount = 0;
                let existingNames = new Set(institutions.map(i => i.nama.toLowerCase()));

                for (const row of jsonData) {
                    // Try to find column "Nama Lembaga" or first column
                    const keys = Object.keys(row);
                    let name = row["Nama Lembaga"];
                    
                    if (!name && keys.length > 0) {
                        // Fallback: use first column if header matches roughly or just take first value
                        const firstKey = keys[0];
                        if (typeof row[firstKey] === 'string') {
                            name = row[firstKey];
                        }
                    }

                    if (name && typeof name === 'string' && name.trim()) {
                        const cleanName = name.trim();
                        // Check duplicate in current list to save API calls
                        if (existingNames.has(cleanName.toLowerCase())) {
                            failCount++; // Skip duplicate
                            continue;
                        }

                        // Try Insert
                        const { error } = await client.from('institutions').insert([{ nama: cleanName }]);
                        if (!error) {
                            successCount++;
                            existingNames.add(cleanName.toLowerCase());
                        } else {
                            failCount++;
                        }
                    } else {
                        failCount++;
                    }
                }

                await fetchInstitutions(); // Refresh list

                Swal.fire({
                    title: 'Import Selesai',
                    html: `Berhasil menambahkan <b>${successCount}</b> lembaga.<br/>Dilewati/Gagal: <b>${failCount}</b>.`,
                    icon: successCount > 0 ? 'success' : 'warning'
                });

            } catch (err) {
                console.error(err);
                Swal.fire("Gagal Import", "Pastikan file Excel valid (.xlsx) dan sesuai template.", "error");
            } finally {
                setImporting(false);
            }
        };
        reader.readAsArrayBuffer(file);
    };

    return (
        <div className="p-8" data-name="institution-manager" data-file="components/InstitutionManager.js">
            <div className="flex flex-col md:flex-row justify-between items-start md:items-center mb-6 gap-4">
                <div>
                    <h2 className="text-2xl font-bold text-gray-800">Manajemen Data Lembaga</h2>
                    <p className="text-gray-500">Tambah, edit, atau hapus referensi nama lembaga/satminkal.</p>
                </div>
                <div className="flex gap-2">
                    <button 
                        onClick={handleDownloadTemplate}
                        className="bg-white border border-gray-300 text-gray-700 px-3 py-2 rounded flex items-center gap-2 hover:bg-gray-50 transition-colors text-sm shadow-sm"
                        title="Download Template Excel"
                    >
                        <div className="icon-download text-lg"></div>
                        <span className="hidden sm:inline">Template</span>
                    </button>
                    <button 
                        onClick={() => fileInputRef.current?.click()}
                        disabled={importing}
                        className="bg-green-600 text-white px-3 py-2 rounded flex items-center gap-2 hover:bg-green-700 transition-colors text-sm shadow-sm"
                    >
                        {importing ? (
                            <div className="animate-spin w-4 h-4 border-2 border-white border-t-transparent rounded-full"></div>
                        ) : (
                            <div className="icon-upload text-lg"></div>
                        )}
                        <span className="hidden sm:inline">Import Excel</span>
                    </button>
                    <button 
                        onClick={handleExportExcel}
                        className="bg-blue-600 text-white px-3 py-2 rounded flex items-center gap-2 hover:bg-blue-700 transition-colors text-sm shadow-sm"
                    >
                        <div className="icon-file-spreadsheet text-lg"></div>
                        <span className="hidden sm:inline">Export Excel</span>
                    </button>
                    
                    {/* Hidden Input */}
                    <input 
                        type="file" 
                        ref={fileInputRef}
                        onChange={handleFileSelect}
                        accept=".xlsx, .xls"
                        className="hidden"
                    />
                </div>
            </div>
            
            {error && (
                 <div className="bg-red-50 text-red-600 p-4 rounded mb-6 border border-red-200">
                    <strong>Terjadi Kesalahan:</strong> {error}
                    {(error.includes('Tabel') || error.includes('42P01')) && (
                        <div className="mt-2 text-sm text-gray-700">
                            Silakan jalankan script SQL tambahan untuk membuat tabel institutions.
                        </div>
                    )}
                 </div>
            )}

            {selectedIds.length > 0 && (
                <div className="bg-red-50 border border-red-200 p-4 rounded mb-6 flex justify-between items-center animate-pulse-once">
                    <div className="text-red-800 font-medium text-sm">
                        {selectedIds.length} lembaga terpilih
                    </div>
                    <button 
                        onClick={handleBulkDelete}
                        className="bg-red-600 hover:bg-red-700 text-white px-4 py-2 rounded flex items-center gap-2 shadow-sm transition-colors text-xs"
                    >
                        <div className="icon-trash-2 text-base"></div>
                        Hapus Terpilih
                    </button>
                </div>
            )}

            <div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
                {/* Form Section */}
                <div className="lg:col-span-1">
                    <div className="bg-white p-6 rounded-lg shadow border border-gray-200 sticky top-8">
                        <h3 className="font-bold text-lg mb-4">
                            {editingId ? 'Edit Lembaga' : 'Tambah Lembaga Baru'}
                        </h3>
                        <form onSubmit={handleSubmit}>
                            <div className="mb-4">
                                <label className="block text-sm font-medium text-gray-700 mb-1">Nama Lembaga</label>
                                <input 
                                    type="text"
                                    required
                                    className="w-full p-2 border border-gray-300 rounded focus:ring-2 focus:ring-teal-500 outline-none"
                                    placeholder="Contoh: MAM 1 Paciran"
                                    value={formData.nama}
                                    onChange={e => setFormData({ ...formData, nama: e.target.value })}
                                />
                            </div>
                            <div className="flex gap-2">
                                <button 
                                    type="submit"
                                    className="flex-1 bg-teal-600 text-white py-2 rounded hover:bg-teal-700 transition-colors"
                                >
                                    {editingId ? 'Simpan Perubahan' : 'Tambah'}
                                </button>
                                {editingId && (
                                    <button 
                                        type="button"
                                        onClick={handleCancel}
                                        className="px-4 py-2 border border-gray-300 rounded hover:bg-gray-50"
                                    >
                                        Batal
                                    </button>
                                )}
                            </div>
                        </form>
                    </div>
                </div>

                {/* List Section */}
                <div className="lg:col-span-2">
                    <div className="bg-white rounded-lg shadow border border-gray-200 overflow-hidden">
                        <div className="p-4 bg-gray-50 border-b border-gray-200 flex justify-between items-center">
                            <h3 className="font-bold text-gray-700">Daftar Lembaga ({institutions.length})</h3>
                        </div>
                        <div className="overflow-x-auto max-h-[600px] overflow-y-auto">
                            <table className="w-full text-sm text-left">
                                <thead className="bg-gray-100 text-gray-600 font-medium border-b border-gray-200 sticky top-0">
                                    <tr>
                                        <th className="px-6 py-3 w-10">
                                            <input 
                                                type="checkbox" 
                                                className="rounded border-gray-300 text-teal-600 focus:ring-teal-500 w-4 h-4 cursor-pointer"
                                                checked={institutions.length > 0 && selectedIds.length === institutions.length}
                                                onChange={handleSelectAll}
                                                disabled={loading || institutions.length === 0}
                                            />
                                        </th>
                                        <th className="px-6 py-3 w-12">No</th>
                                        <th className="px-6 py-3">Nama Lembaga</th>
                                        <th className="px-6 py-3 text-right">Aksi</th>
                                    </tr>
                                </thead>
                                <tbody className="divide-y divide-gray-200">
                                    {loading ? (
                                        <tr>
                                            <td colSpan="4" className="px-6 py-8 text-center text-gray-500">Memuat...</td>
                                        </tr>
                                    ) : institutions.length === 0 ? (
                                        <tr>
                                            <td colSpan="4" className="px-6 py-8 text-center text-gray-500">Belum ada data lembaga.</td>
                                        </tr>
                                    ) : (
                                        institutions.map((inst, index) => (
                                            <tr key={inst.id} className={`hover:bg-gray-50 ${selectedIds.includes(inst.id) ? 'bg-teal-50' : ''}`}>
                                                <td className="px-6 py-3">
                                                    <input 
                                                        type="checkbox" 
                                                        className="rounded border-gray-300 text-teal-600 focus:ring-teal-500 w-4 h-4 cursor-pointer"
                                                        checked={selectedIds.includes(inst.id)}
                                                        onChange={() => handleSelectOne(inst.id)}
                                                    />
                                                </td>
                                                <td className="px-6 py-3 text-gray-500">{index + 1}</td>
                                                <td className="px-6 py-3 font-medium text-gray-900">{inst.nama}</td>
                                                <td className="px-6 py-3 text-right space-x-2">
                                                    <button 
                                                        onClick={() => handleEdit(inst)}
                                                        className="text-blue-600 hover:text-blue-800"
                                                        title="Edit"
                                                    >
                                                        <div className="icon-pencil text-lg"></div>
                                                    </button>
                                                    <button 
                                                        onClick={() => handleDelete(inst.id)}
                                                        className="text-red-600 hover:text-red-800"
                                                        title="Hapus"
                                                    >
                                                        <div className="icon-trash text-lg"></div>
                                                    </button>
                                                </td>
                                            </tr>
                                        ))
                                    )}
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    );
}