import { useState, useEffect } from 'react';
import {
  Akun,
  Jurnal,
  PeriodeAkuntansi,
  ProfilPerusahaan,
  User,
  AuditLog,
  ActivityLog,
  AsetTetap,
  VendorSupplier,
  VirtualLedgerItem,
  Role,
} from './types/accounting';
import { StorageService } from './services/storage';
import { AccountingEngine } from './services/accountingEngine';
import { AdminLteLayout } from './components/layout/AdminLteLayout';
import { DashboardView } from './components/dashboard/DashboardView';
import { DaftarAkunView } from './components/coa/DaftarAkunView';
import { JurnalUmumView } from './components/journal/JurnalUmumView';
import { NeracaSaldoView } from './components/reports/NeracaSaldoView';
import { NeracaLajurView } from './components/reports/NeracaLajurView';
import { LaporanKeuanganView } from './components/reports/LaporanKeuanganView';
import { RincianPenyusutanView } from './components/reports/RincianPenyusutanView';
import { AnalisisRasioView } from './components/reports/AnalisisRasioView';
import { VirtualLedgerView } from './components/vendors/VirtualLedgerView';
import { UserManagementView } from './components/users/UserManagementView';
import { AuditLogView } from './components/logs/AuditLogView';
import { DatabaseCI4View } from './components/database/DatabaseCI4View';
import { PanduanPemakaianView } from './components/guide/PanduanPemakaianView';
import { ProfilPerusahaanModal } from './components/profile/ProfilPerusahaanModal';
import { TutupBukuModal } from './components/period/TutupBukuModal';
import { KelolaPeriodeModal } from './components/period/KelolaPeriodeModal';
import { AiDiagnosticModal } from './components/diagnostic/AiDiagnosticModal';
import { SignatoriesConfigModal } from './components/signatories/SignatoriesConfigModal';

export default function App() {
  const [activeTab, setActiveTab] = useState<string>('dashboard');
  const [profile, setProfile] = useState<ProfilPerusahaan>(StorageService.getProfile());
  const [akuns, setAkuns] = useState<Akun[]>(StorageService.getAkun());
  const [journals, setJournals] = useState<Jurnal[]>(StorageService.getJurnal());
  const [periodes, setPeriodes] = useState<PeriodeAkuntansi[]>(StorageService.getPeriodes());
  const [activePeriode, setActivePeriode] = useState<PeriodeAkuntansi>(StorageService.getActivePeriode());
  const [users, setUsers] = useState<User[]>(StorageService.getUsers());
  const [activeUser, setActiveUser] = useState<User>(StorageService.getActiveUser());
  const [auditLogs, setAuditLogs] = useState<AuditLog[]>(StorageService.getAuditLogs());
  const [activityLogs, setActivityLogs] = useState<ActivityLog[]>(StorageService.getActivityLogs());
  const [asetTetap, setAsetTetap] = useState<AsetTetap[]>(StorageService.getAsetTetap());
  const [vendors, setVendors] = useState<VendorSupplier[]>(StorageService.getVendors());
  const [virtualLedgers, setVirtualLedgers] = useState<VirtualLedgerItem[]>(StorageService.getVirtualLedgers());
  const [roles, setRoles] = useState<Role[]>(StorageService.getRoles());

  // Modal States
  const [isProfilModalOpen, setIsProfilModalOpen] = useState(false);
  const [isTutupBukuModalOpen, setIsTutupBukuModalOpen] = useState(false);
  const [isKelolaPeriodeModalOpen, setIsKelolaPeriodeModalOpen] = useState(false);
  const [isAiDiagnosticOpen, setIsAiDiagnosticOpen] = useState(false);
  const [isSignatoriesModalOpen, setIsSignatoriesModalOpen] = useState(false);

  // Sync state helper
  const reloadData = () => {
    setProfile(StorageService.getProfile());
    setAkuns(StorageService.getAkun());
    setJournals(StorageService.getJurnal());
    setPeriodes(StorageService.getPeriodes());
    setActivePeriode(StorageService.getActivePeriode());
    setUsers(StorageService.getUsers());
    setActiveUser(StorageService.getActiveUser());
    setAuditLogs(StorageService.getAuditLogs());
    setActivityLogs(StorageService.getActivityLogs());
    setAsetTetap(StorageService.getAsetTetap());
    setVendors(StorageService.getVendors());
    setVirtualLedgers(StorageService.getVirtualLedgers());
    setRoles(StorageService.getRoles());
  };

  useEffect(() => {
    let mounted = true;
    StorageService.init();
    reloadData();

    // MySQL menjadi sumber data utama untuk laporan. LocalStorage hanya cache awal.
    const handleDatabaseChanged = () => {
      StorageService.syncFromDatabase().then((result) => {
        if (mounted && result.success) reloadData();
      });
    };
    window.addEventListener('accounting-database-changed', handleDatabaseChanged);

    StorageService.syncFromDatabase().then((result) => {
      if (mounted && result.success) reloadData();
      if (!result.success) console.warn('[Database] Sinkronisasi awal tidak berhasil:', result.message);
    });

    return () => {
      mounted = false;
      window.removeEventListener('accounting-database-changed', handleDatabaseChanged);
    };
  }, []);

  // Handlers for Akun (COA)
  const handleSaveAkun = (akun: Akun) => {
    StorageService.saveAkun(akun);
    reloadData();
  };

  const handleDeleteAkun = (id: string) => {
    const result = StorageService.deleteAkun(id);
    reloadData();
    return result;
  };

  const handleImportAkuns = (imported: Partial<Akun>[]) => {
    for (const a of imported) {
      if (a.kodeAkun && a.namaAkun) {
        const fullAkun: Akun = {
          id: `ak-${Date.now()}-${Math.floor(Math.random() * 1000)}`,
          kodeAkun: a.kodeAkun,
          namaAkun: a.namaAkun,
          kategori: a.kategori || 'Aktiva Lancar',
          posSaldo: a.posSaldo || 'Debet',
          posLaporan: a.posLaporan || 'Neraca',
          saldoAwalDebet: a.saldoAwalDebet || 0,
          saldoAwalKredit: a.saldoAwalKredit || 0,
          arusKasKategori: a.arusKasKategori || 'Operasi',
          keterangan: a.keterangan || '',
        };
        StorageService.saveAkun(fullAkun);
      }
    }
    reloadData();
  };

  // Handlers for Jurnal
  const handleSaveJurnal = (jurnal: Jurnal) => {
    StorageService.saveJurnal(jurnal);
    reloadData();
  };

  const handleDeleteJurnal = (id: string) => {
    const res = StorageService.deleteJurnal(id);
    reloadData();
    return res;
  };

  const handleImportJournals = (newJournals: Jurnal[]) => {
    for (const j of newJournals) {
      StorageService.saveJurnal(j);
    }
    StorageService.logAudit(
      'IMPORT',
      'JURNAL',
      `BATCH-${newJournals.length}`,
      undefined,
      `${newJournals.length} transaksi diimpor dari Excel`,
      `Impor massal ${newJournals.length} transaksi jurnal via file spreadsheet`
    );
    reloadData();
  };

  const handleApplyCorrectionJournal = (correction: Jurnal) => {
    StorageService.saveJurnal(correction);
    StorageService.logAudit(
      'INSERT',
      'JURNAL',
      correction.id,
      undefined,
      JSON.stringify(correction),
      `Ayat Jurnal Penyesuaian Koreksi Penyeimbang Neraca Saldo (Rp ${correction.totalDebet.toLocaleString('id-ID')})`
    );
    reloadData();
  };

  // Handlers for Periode & Roll-over
  const handleSelectPeriode = (p: PeriodeAkuntansi) => {
    StorageService.setActivePeriode(p);
    setActivePeriode(p);
    reloadData();
  };

  const handleConfirmClosePeriod = (
    currentPeriod: PeriodeAkuntansi,
    nextPeriod: PeriodeAkuntansi,
    updatedAkuns: Akun[]
  ) => {
    StorageService.closePeriodAndRollOver(currentPeriod, nextPeriod, updatedAkuns);
    reloadData();
  };

  // Handlers for User & Profile
  const handleSaveProfile = (updated: ProfilPerusahaan) => {
    StorageService.saveProfile(updated);
    reloadData();
  };

  const handleSaveUser = (user: User) => {
    StorageService.saveUser(user);
    reloadData();
  };

  const handleDeleteUser = (id: string) => {
    const res = StorageService.deleteUser(id);
    reloadData();
    return res;
  };

  const handleSaveAset = (aset: AsetTetap) => {
    StorageService.saveAsetTetap(aset);
    reloadData();
  };

  const handleDeleteAset = (id: string) => {
    const res = StorageService.deleteAsetTetap(id);
    reloadData();
    return res;
  };

  const handleSwitchUser = (user: User) => {
    StorageService.setActiveUser(user);
    setActiveUser(user);
    reloadData();
  };

  const handleResetData = () => {
    StorageService.resetAllData();
    reloadData();
    setActiveTab('dashboard');
  };

  const canEdit = activeUser.role === 'superadmin' || activeUser.role === 'akuntan';

  // Balance calculation for active state
  const trialBalanceResult = AccountingEngine.calculateNeracaSaldo(akuns, journals);

  return (
    <AdminLteLayout
      activeTab={activeTab}
      onSelectTab={setActiveTab}
      profile={profile}
      activePeriode={activePeriode}
      periodes={periodes}
      onSelectPeriode={handleSelectPeriode}
      activeUser={activeUser}
      onOpenProfilModal={() => setIsProfilModalOpen(true)}
      onOpenTutupBukuModal={() => setIsTutupBukuModalOpen(true)}
      onOpenAiDiagnosticModal={() => setIsAiDiagnosticOpen(true)}
      onOpenKelolaPeriodeModal={() => setIsKelolaPeriodeModalOpen(true)}
      accountCount={akuns.length}
      journalCount={journals.length}
      isBalanced={trialBalanceResult.isBalanced}
      onOpenSignatoriesModal={() => setIsSignatoriesModalOpen(true)}
    >
      {/* 1. Dashboard View */}
      {activeTab === 'dashboard' && (
        <DashboardView
          akuns={akuns}
          journals={journals}
          profile={profile}
          activePeriode={activePeriode}
          activeUser={activeUser}
          onNavigate={setActiveTab}
          onOpenTutupBuku={() => setIsTutupBukuModalOpen(true)}
          onOpenKelolaPeriode={() => setIsKelolaPeriodeModalOpen(true)}
        />
      )}

      {/* 2. Daftar Akun (COA) View */}
      {activeTab === 'coa' && (
        <DaftarAkunView
          akuns={akuns}
          profile={profile}
          onSaveAkun={handleSaveAkun}
          onDeleteAkun={handleDeleteAkun}
          onImportAkuns={handleImportAkuns}
          canEdit={canEdit}
        />
      )}

      {/* 2b. Buku Pembantu Utang / Piutang & Rekanan Virtual Account (Virtual Ledger) */}
      {(activeTab === 'vendors' || activeTab === 'vl' || activeTab === 'virtual-ledger') && (
        <VirtualLedgerView
          vendors={vendors}
          virtualLedgers={virtualLedgers}
          activeUser={activeUser}
          roles={roles}
          profile={profile}
          activePeriode={activePeriode}
          periodes={periodes}
          onRefreshData={reloadData}
          onNavigateToJurnal={() => setActiveTab('jurnal')}
          onNavigateToNeraca={() => setActiveTab('laporan-balancesheet')}
        />
      )}

      {/* 3. Jurnal Umum & Penyesuaian View */}
      {activeTab === 'jurnal' && (
        <JurnalUmumView
          journals={journals}
          akuns={akuns}
          profile={profile}
          activePeriodeNama={activePeriode.namaPeriode}
          onSaveJurnal={handleSaveJurnal}
          onDeleteJurnal={handleDeleteJurnal}
          onImportJournals={handleImportJournals}
          canEdit={canEdit}
          vendors={vendors}
          onRefreshData={reloadData}
          onNavigateTab={(tab) => setActiveTab(tab)}
          periodes={periodes}
          onOpenKelolaPeriodeModal={() => setIsKelolaPeriodeModalOpen(true)}
        />
      )}

      {/* 4. Neraca Saldo (Trial Balance) View */}
      {activeTab === 'neracasaldo' && (
        <NeracaSaldoView
          akuns={akuns}
          journals={journals}
          profile={profile}
          periodes={periodes}
          activePeriode={activePeriode}
          onOpenAiDiagnostic={() => setIsAiDiagnosticOpen(true)}
        />
      )}

      {/* 5. Neraca Lajur (10-Kolom Worksheet) View */}
      {activeTab === 'neracalajur' && (
        <NeracaLajurView
          akuns={akuns}
          journals={journals}
          profile={profile}
          periodes={periodes}
          activePeriode={activePeriode}
        />
      )}

      {/* 6. Laporan Keuangan Lengkap View (with dedicated tabs for Laba Rugi, Capital Statement, Balance Sheet Stafel, Neraca Skontro, Pemetaan Akun, Arus Kas, GOP, Rasio) */}
      {activeTab.startsWith('laporan') && activeTab !== 'laporan-penyusutan' && activeTab !== 'laporan-rasio' && (
        <LaporanKeuanganView
          akuns={akuns}
          journals={journals}
          profile={profile}
          periodes={periodes}
          activePeriode={activePeriode}
          asetTetap={asetTetap}
          initialTab={
            activeTab.startsWith('laporan-')
              ? (activeTab.replace('laporan-', '') as any)
              : 'labarugi'
          }
          onTabChange={(t) => setActiveTab(`laporan-${t}`)}
          onNavigate={(target) => setActiveTab(target)}
          onOpenSignatoriesModal={() => setIsSignatoriesModalOpen(true)}
        />
      )}

      {/* 6b. Rincian Penyusutan Aset Tetap View (PSAK 16 / SAK EMKM) */}
      {(activeTab === 'penyusutan' || activeTab === 'laporan-penyusutan') && (
        <RincianPenyusutanView
          asetList={asetTetap}
          profile={profile}
          activePeriode={activePeriode}
          onSaveAset={handleSaveAset}
          onDeleteAset={handleDeleteAset}
        />
      )}

      {/* 6c. Analisis Rasio Keuangan View (Likuiditas & Solvabilitas) */}
      {(activeTab === 'analisis-rasio' || activeTab === 'laporan-rasio') && (
        <AnalisisRasioView
          akuns={akuns}
          journals={journals}
          profile={profile}
          activePeriode={activePeriode}
          onNavigateToNeraca={() => setActiveTab('laporan-balancesheet')}
          onNavigateToLabaRugi={() => setActiveTab('laporan-labarugi')}
        />
      )}

      {/* 7. Database MySQL / Postgres & CI4 View */}
      {activeTab === 'database' && (
        <DatabaseCI4View
          profile={profile}
          akuns={akuns}
          journals={journals}
          users={users}
          asetTetap={asetTetap}
          onResetData={handleResetData}
        />
      )}

      {/* 8. User Management View */}
      {activeTab === 'users' && (
        <UserManagementView
          users={users}
          activeUser={activeUser}
          onSaveUser={handleSaveUser}
          onDeleteUser={handleDeleteUser}
          onSwitchUser={handleSwitchUser}
        />
      )}

      {/* 9. Audit Trail & Activity Logs View */}
      {activeTab === 'audit' && (
        <AuditLogView
          auditLogs={auditLogs}
          activityLogs={activityLogs}
        />
      )}

      {/* 10. Panduan Pemakaian View */}
      {activeTab === 'panduan' && <PanduanPemakaianView />}

      {/* Profil Perusahaan Modal (Webcam Camera, Local File, Cloud URL) */}
      <ProfilPerusahaanModal
        isOpen={isProfilModalOpen}
        onClose={() => setIsProfilModalOpen(false)}
        profile={profile}
        onSave={handleSaveProfile}
      />

      {/* Tutup Buku Modal (Roll-over closing to opening balances) */}
      <TutupBukuModal
        isOpen={isTutupBukuModalOpen}
        onClose={() => setIsTutupBukuModalOpen(false)}
        currentPeriod={activePeriode}
        akuns={akuns}
        journals={journals}
        profile={profile}
        onConfirmClose={handleConfirmClosePeriod}
      />

      {/* AI Forensic Diagnostic Modal (for finding trial balance unbalance causes) */}
      <AiDiagnosticModal
        isOpen={isAiDiagnosticOpen}
        onClose={() => setIsAiDiagnosticOpen(false)}
        akuns={akuns}
        journals={journals}
        profile={profile}
        totalDebet={trialBalanceResult.totalNeracaSaldoDebet}
        totalKredit={trialBalanceResult.totalNeracaSaldoKredit}
        onApplyCorrectionJournal={handleApplyCorrectionJournal}
      />

      {/* Kelola Periode Akuntansi & Sinkronisasi Transaksi Modal */}
      <KelolaPeriodeModal
        isOpen={isKelolaPeriodeModalOpen}
        onClose={() => setIsKelolaPeriodeModalOpen(false)}
        periodes={periodes}
        activePeriode={activePeriode}
        journals={journals}
        akuns={akuns}
        profile={profile}
        onSelectPeriode={handleSelectPeriode}
        onOpenTutupBuku={() => {
          setIsKelolaPeriodeModalOpen(false);
          setIsTutupBukuModalOpen(true);
        }}
        onRefreshData={() => reloadData()}
      />

      {/* Penandatangan Dokumen Dinamis & QR Code Modal */}
      <SignatoriesConfigModal
        isOpen={isSignatoriesModalOpen}
        onClose={() => setIsSignatoriesModalOpen(false)}
        profile={profile}
        users={users}
        onConfigSaved={(_cfg) => {
          reloadData();
        }}
      />
    </AdminLteLayout>
  );
}
