import React, { useState } from 'react';
import { Akun, Jurnal, ProfilPerusahaan } from '../../types/accounting';
import { getApiUrl } from '../../services/apiConfig';
import {
  Sparkles,
  AlertTriangle,
  CheckCircle2,
  HelpCircle,
  ArrowRight,
  RefreshCw,
  Search,
  Check,
  X,
  FileText,
  Lightbulb,
} from 'lucide-react';

interface AiDiagnosticModalProps {
  isOpen: boolean;
  onClose: () => void;
  akuns: Akun[];
  journals: Jurnal[];
  profile: ProfilPerusahaan;
  totalDebet: number;
  totalKredit: number;
  onNavigateToJournal?: (journalId: string) => void;
  onApplyCorrectionJournal?: (correctionJournal: Jurnal) => void;
}

export const AiDiagnosticModal: React.FC<AiDiagnosticModalProps> = ({
  isOpen,
  onClose,
  akuns,
  journals,
  profile,
  totalDebet,
  totalKredit,
  onApplyCorrectionJournal,
}) => {
  const [loadingAi, setLoadingAi] = useState(false);
  const [aiResult, setAiResult] = useState<string | null>(null);
  const [aiSource, setAiSource] = useState<string>('');

  if (!isOpen) return null;

  const selisih = Math.abs(totalDebet - totalKredit);
  const isBalanced = selisih < 1;

  // 1. Check unbalanced journals
  const unbalancedJournals = journals.filter(
    (j) => Math.abs(j.totalDebet - j.totalKredit) > 0.01
  );

  // 2. Check opening balances discrepancy
  const totalSADebet = akuns.reduce((s, a) => s + (a.saldoAwalDebet || 0), 0);
  const totalSAKredit = akuns.reduce((s, a) => s + (a.saldoAwalKredit || 0), 0);
  const isOpeningBalanced = Math.abs(totalSADebet - totalSAKredit) < 1;

  // 3. Transposition check (Divisible by 9)
  const isTransposition = selisih > 0 && selisih % 9 === 0;

  // 4. Double posting / Wrong side check (Divisible by 2)
  const halfSelisih = selisih / 2;
  const candidateDoublePosting: { type: string; desc: string; amount: number }[] = [];

  // Check if any journal item has amount == halfSelisih
  for (const j of journals) {
    for (const item of j.items) {
      if (Math.abs(item.debet - halfSelisih) < 0.01 || Math.abs(item.kredit - halfSelisih) < 0.01) {
        candidateDoublePosting.push({
          type: 'Item Jurnal',
          desc: `${j.noBukti} (${item.namaAkun})`,
          amount: halfSelisih,
        });
      }
    }
  }

  // 5. Abnormal account balances check
  const abnormalAccounts: {
    akun: Akun;
    saldoDebet: number;
    saldoKredit: number;
    reason: string;
  }[] = [];

  for (const a of akuns) {
    // calculate ending balance of this account
    let sumD = a.saldoAwalDebet || 0;
    let sumK = a.saldoAwalKredit || 0;
    for (const j of journals) {
      for (const it of j.items) {
        if (it.akunId === a.id || it.kodeAkun === a.kodeAkun) {
          sumD += it.debet || 0;
          sumK += it.kredit || 0;
        }
      }
    }

    if (a.posSaldo === 'Debet' && sumK > sumD) {
      abnormalAccounts.push({
        akun: a,
        saldoDebet: sumD,
        saldoKredit: sumK,
        reason: `Akun bertipe ${a.kategori} memiliki saldo berlawanan (Kredit > Debet).`,
      });
    } else if (a.posSaldo === 'Kredit' && sumD > sumK) {
      abnormalAccounts.push({
        akun: a,
        saldoDebet: sumD,
        saldoKredit: sumK,
        reason: `Akun bertipe ${a.kategori} memiliki saldo berlawanan (Debet > Kredit).`,
      });
    }
  }

  // Handle AI Diagnosis request
  const handleRequestAiDiagnosis = async () => {
    setLoadingAi(true);
    setAiResult(null);

    try {
      const payload = {
        totalDebet,
        totalKredit,
        selisih,
        unbalancedJournals: unbalancedJournals.map((j) => ({
          noBukti: j.noBukti,
          tanggal: j.tanggal,
          totalDebet: j.totalDebet,
          totalKredit: j.totalKredit,
          keterangan: j.keterangan,
        })),
        abnormalAccounts: abnormalAccounts.map((ab) => ({
          kodeAkun: ab.akun.kodeAkun,
          namaAkun: ab.akun.namaAkun,
          kategori: ab.akun.kategori,
          posSaldoNormal: ab.akun.posSaldo,
          reason: ab.reason,
        })),
        summaryData: {
          candidateDoublePosting,
          isTransposition,
          isOpeningBalanced,
          selisihSaldoAwal: Math.abs(totalSADebet - totalSAKredit),
        },
      };

      const res = await fetch(getApiUrl('/api/ai/diagnose'), {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(payload),
      });

      const data = await res.json();
      if (data && data.analysis) {
        setAiResult(data.analysis);
        setAiSource(data.source || 'gemini');
      } else {
        throw new Error('Gagal memproses data analisis');
      }
    } catch (err: any) {
      console.error('Diagnostic error:', err);
      // Fallback
      setAiResult(
        `Hasil Analisis Forensik:\n\n1. Selisih Neraca Saldo tercatat sebesar Rp ${selisih.toLocaleString(
          'id-ID'
        )}.\n2. ${
          isTransposition
            ? 'Terdeteksi selisih habis dibagi 9: Indikasi kuat transposisi (salah urutan digit pada pengetikan nominal).'
            : 'Periksa transaksi penyesuaian akhir periode (AJP).'
        }\n3. Periksa akun-akun yang terdaftar pada tabel audit abnormal di bawah.`
      );
      setAiSource('heuristic-fallback');
    } finally {
      setLoadingAi(false);
    }
  };

  // Generate automated correction journal
  const handleCreateCorrectionJournal = () => {
    if (!onApplyCorrectionJournal) return;
    const isDebetLacking = totalDebet < totalKredit;

    const correctionJurnal: Jurnal = {
      id: `jur-kor-${Date.now()}`,
      noBukti: `AJP-KOREKSI-${Date.now().toString().slice(-4)}`,
      tanggal: new Date().toISOString().substring(0, 10),
      bulan: 'Januari 2026',
      tipe: 'AJP',
      keterangan: `Ayat Jurnal Penyesuaian Koreksi Penyeimbang Neraca Saldo (Selisih Rp ${selisih.toLocaleString('id-ID')})`,
      items: [
        {
          id: `ji-kor-1`,
          akunId: akuns[0]?.id || 'ak-101',
          kodeAkun: akuns[0]?.kodeAkun || '1-1001',
          namaAkun: akuns[0]?.namaAkun || 'Kas Operasional',
          debet: isDebetLacking ? selisih : 0,
          kredit: !isDebetLacking ? selisih : 0,
          keteranganItem: 'Koreksi penyeimbang sisi ' + (isDebetLacking ? 'Debet' : 'Kredit'),
        },
        {
          id: `ji-kor-2`,
          akunId: akuns.find((a) => a.kodeAkun === '3-1002')?.id || 'ak-302',
          kodeAkun: '3-1002',
          namaAkun: 'Laba Ditahan (Retained Earnings)',
          debet: !isDebetLacking ? selisih : 0,
          kredit: isDebetLacking ? selisih : 0,
          keteranganItem: 'Penyesuaian ke Laba Ditahan',
        },
      ],
      totalDebet: selisih,
      totalKredit: selisih,
      createdAt: new Date().toISOString().replace('T', ' ').substring(0, 19),
      createdBy: profile.namaAkuntan + ' (AI Auto-Balance)',
    };

    onApplyCorrectionJournal(correctionJurnal);
    onClose();
  };

  return (
    <div className="fixed inset-0 z-50 flex items-center justify-center bg-slate-900/60 p-4 backdrop-blur-xs">
      <div className="flex max-h-[92vh] w-full max-w-4xl flex-col rounded-lg bg-white shadow-2xl">
        {/* Header */}
        <div className="flex items-center justify-between border-b border-slate-200 bg-slate-900 px-6 py-4 text-white rounded-t-lg">
          <div className="flex items-center gap-2.5">
            <div className="rounded-lg bg-indigo-600 p-1.5 text-white">
              <Sparkles className="h-5 w-5" />
            </div>
            <div>
              <h3 className="text-sm font-bold tracking-wider uppercase">
                Deteksi & Audit AI Ketidakseimbangan Neraca Saldo
              </h3>
              <p className="text-[11px] text-slate-400">
                Sistem Forensik Akuntansi Terpadu PT Tio Mandiri Jaya
              </p>
            </div>
          </div>
          <button onClick={onClose} className="text-slate-400 hover:text-white">
            <X className="h-5 w-5" />
          </button>
        </div>

        {/* Content */}
        <div className="flex-1 overflow-y-auto p-6 space-y-6">
          {/* Status Banner */}
          <div
            className={`rounded-lg border p-4 flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 ${
              isBalanced
                ? 'border-emerald-200 bg-emerald-50 text-emerald-900'
                : 'border-red-200 bg-red-50 text-red-950'
            }`}
          >
            <div className="flex items-center gap-3">
              {isBalanced ? (
                <div className="rounded-full bg-emerald-600 p-2 text-white">
                  <CheckCircle2 className="h-6 w-6" />
                </div>
              ) : (
                <div className="rounded-full bg-red-600 p-2 text-white">
                  <AlertTriangle className="h-6 w-6" />
                </div>
              )}
              <div>
                <h4 className="font-bold text-sm">
                  {isBalanced
                    ? 'NERACA SALDO DALAM KONDISI SEIMBANG (BALANCED)'
                    : `TERDETEKSI KETIDAKSEIMBANGAN SEBESAR Rp ${selisih.toLocaleString('id-ID')}`}
                </h4>
                <p className="text-xs opacity-90 mt-0.5">
                  Total Debet: <strong>Rp {totalDebet.toLocaleString('id-ID')}</strong> | Total
                  Kredit: <strong>Rp {totalKredit.toLocaleString('id-ID')}</strong>
                </p>
              </div>
            </div>

            {!isBalanced && (
              <button
                onClick={handleRequestAiDiagnosis}
                disabled={loadingAi}
                className="inline-flex items-center gap-1.5 rounded-lg bg-indigo-600 px-4 py-2 text-xs font-bold text-white shadow-xs hover:bg-indigo-700 disabled:opacity-50"
              >
                <Sparkles className="h-4 w-4" />
                {loadingAi ? 'Menganalisis dengan AI...' : 'Jalankan Audit AI Gemini'}
              </button>
            )}
          </div>

          {/* AI Result Box if available */}
          {aiResult && (
            <div className="rounded-lg border-2 border-indigo-200 bg-indigo-50/40 p-5 space-y-3">
              <div className="flex items-center justify-between border-b border-indigo-200 pb-2">
                <div className="flex items-center gap-2">
                  <Sparkles className="h-4 w-4 text-indigo-700" />
                  <h4 className="font-bold text-xs uppercase tracking-wider text-indigo-900">
                    Laporan Analisis Forensik AI ({aiSource === 'gemini' ? 'Gemini 3.8 Flash' : 'Audit Heuristik'})
                  </h4>
                </div>
                <span className="rounded bg-indigo-100 px-2 py-0.5 text-[10px] font-bold text-indigo-800">
                  Terverifikasi PSAK
                </span>
              </div>

              <div className="whitespace-pre-wrap text-xs text-slate-800 leading-relaxed font-sans bg-white p-4 rounded border border-indigo-100">
                {aiResult}
              </div>

              <div className="flex justify-end gap-2 pt-1">
                {onApplyCorrectionJournal && !isBalanced && (
                  <button
                    onClick={handleCreateCorrectionJournal}
                    className="inline-flex items-center gap-1.5 rounded bg-emerald-600 px-3 py-1.5 text-xs font-semibold text-white shadow-xs hover:bg-emerald-700"
                  >
                    <Check className="h-3.5 w-3.5" />
                    Buat Jurnal Koreksi Penyeimbang Otomatis
                  </button>
                )}
              </div>
            </div>
          )}

          {/* Forensic Rule 1: Transposition (Kaidah Angka 9) */}
          <div className="rounded-lg border border-slate-200 bg-white p-4 space-y-3">
            <div className="flex items-center justify-between border-b border-slate-100 pb-2">
              <div className="flex items-center gap-2">
                <Lightbulb className="h-4 w-4 text-amber-600" />
                <h4 className="font-bold text-xs uppercase tracking-wider text-slate-800">
                  1. Kaidah Angka 9 (Kaidah Transposisi Angka)
                </h4>
              </div>
              <span
                className={`rounded px-2 py-0.5 text-[10px] font-bold ${
                  isTransposition
                    ? 'bg-amber-100 text-amber-800 border border-amber-300'
                    : 'bg-slate-100 text-slate-600'
                }`}
              >
                {isTransposition ? 'INDIKASI TRANSPOSISI TERDETEKSI' : 'Tidak Terindikasi'}
              </span>
            </div>

            <p className="text-xs text-slate-600 leading-relaxed">
              Dalam prinsip akuntansi, jika selisih habis dibagi 9, kemungkinan besar terjadi
              kesalahan transposisi angka (urutan angka tertukar saat pengetikan manual, contoh:
              mengetik <strong>Rp 45.000</strong> menjadi <strong>Rp 54.000</strong>, selisih 9.000).
            </p>

            {isTransposition && (
              <div className="rounded bg-amber-50 p-2.5 text-xs text-amber-900 border border-amber-200">
                Selisih <strong>Rp {selisih.toLocaleString('id-ID')}</strong> habis dibagi 9
                (Hasil bagi: <strong>{selisih / 9}</strong>). Periksa jurnal yang memiliki nominal
                angka tertukar pada digit dengan selisih tersebut.
              </div>
            )}
          </div>

          {/* Forensic Rule 2: Double Posting / Wrong Side (Kaidah Angka 2) */}
          <div className="rounded-lg border border-slate-200 bg-white p-4 space-y-3">
            <div className="flex items-center justify-between border-b border-slate-100 pb-2">
              <div className="flex items-center gap-2">
                <ArrowRight className="h-4 w-4 text-blue-600" />
                <h4 className="font-bold text-xs uppercase tracking-wider text-slate-800">
                  2. Kaidah Angka 2 (Salah Penempatan Sisi Debet / Kredit)
                </h4>
              </div>
              <span className="font-mono text-xs font-bold text-blue-900">
                Setengah Selisih: Rp {halfSelisih.toLocaleString('id-ID')}
              </span>
            </div>

            <p className="text-xs text-slate-600 leading-relaxed">
              Jika sebuah akun atau transaksi seharusnya berada di sisi Kredit namun tidak sengaja
              diinput di sisi Debet, neraca saldo akan berselisih sebesar <strong>2x lipat</strong> dari
              nominal angka tersebut.
            </p>

            {candidateDoublePosting.length > 0 ? (
              <div className="rounded bg-blue-50 p-3 text-xs text-blue-900 border border-blue-200 space-y-1">
                <strong>Temuan Akun/Jurnal yang Cocok dengan Rp {halfSelisih.toLocaleString('id-ID')}:</strong>
                <ul className="list-disc pl-5">
                  {candidateDoublePosting.map((c, idx) => (
                    <li key={idx}>
                      {c.type}: <strong>{c.desc}</strong> bernilai Rp {c.amount.toLocaleString('id-ID')}
                    </li>
                  ))}
                </ul>
              </div>
            ) : (
              <p className="text-[11px] text-slate-400 italic">
                Tidak ditemukan transaksi bernilai tepat Rp {halfSelisih.toLocaleString('id-ID')}.
              </p>
            )}
          </div>

          {/* Forensic Rule 3: Jurnal Tidak Seimbang */}
          <div className="rounded-lg border border-slate-200 bg-white p-4 space-y-3">
            <div className="flex items-center justify-between border-b border-slate-100 pb-2">
              <div className="flex items-center gap-2">
                <FileText className="h-4 w-4 text-rose-600" />
                <h4 className="font-bold text-xs uppercase tracking-wider text-slate-800">
                  3. Audit Baris Jurnal Belum Seimbang ({unbalancedJournals.length})
                </h4>
              </div>
              <span
                className={`rounded px-2 py-0.5 text-[10px] font-bold ${
                  unbalancedJournals.length > 0
                    ? 'bg-rose-100 text-rose-800'
                    : 'bg-emerald-100 text-emerald-800'
                }`}
              >
                {unbalancedJournals.length > 0 ? 'DITEMUKAN MASALAH' : 'Semua Jurnal Seimbang'}
              </span>
            </div>

            {unbalancedJournals.length > 0 ? (
              <div className="space-y-2">
                {unbalancedJournals.map((j) => (
                  <div
                    key={j.id}
                    className="flex items-center justify-between rounded border border-rose-200 bg-rose-50/50 p-2 text-xs"
                  >
                    <div>
                      <span className="font-mono font-bold text-rose-900">{j.noBukti}</span> - {j.keterangan}
                      <div className="text-[11px] text-slate-500">Tanggal: {j.tanggal}</div>
                    </div>
                    <div className="text-right font-mono">
                      <div className="text-slate-700">Debet: {j.totalDebet.toLocaleString('id-ID')}</div>
                      <div className="text-slate-700">Kredit: {j.totalKredit.toLocaleString('id-ID')}</div>
                      <div className="font-bold text-rose-700">
                        Selisih: Rp {Math.abs(j.totalDebet - j.totalKredit).toLocaleString('id-ID')}
                      </div>
                    </div>
                  </div>
                ))}
              </div>
            ) : (
              <p className="text-xs text-slate-500">
                Seluruh transaksi pada buku jurnal umum dan penyesuaian telah seimbang antara total debet
                dan total kredit.
              </p>
            )}
          </div>

          {/* Forensic Rule 4: Saldo Awal Discrepancy */}
          <div className="rounded-lg border border-slate-200 bg-white p-4 space-y-2">
            <div className="flex items-center justify-between border-b border-slate-100 pb-2">
              <h4 className="font-bold text-xs uppercase tracking-wider text-slate-800">
                4. Keseimbangan Saldo Awal (Post Closing Trial Balance)
              </h4>
              <span
                className={`rounded px-2 py-0.5 text-[10px] font-bold ${
                  isOpeningBalanced
                    ? 'bg-emerald-100 text-emerald-800'
                    : 'bg-red-100 text-red-800'
                }`}
              >
                {isOpeningBalanced ? 'SALDO AWAL SEIMBANG' : 'SALDO AWAL BERSELISIH'}
              </span>
            </div>
            <p className="text-xs text-slate-600">
              Total Saldo Awal Debet: <strong>Rp {totalSADebet.toLocaleString('id-ID')}</strong> | Total
              Saldo Awal Kredit: <strong>Rp {totalSAKredit.toLocaleString('id-ID')}</strong>
            </p>
            {!isOpeningBalanced && (
              <p className="text-xs text-red-700 font-semibold">
                Periksa menu <strong>Daftar Akun</strong> dan sesuaikan kolom Saldo Awal agar posisi
                Debet dan Kredit bernilai sama.
              </p>
            )}
          </div>
        </div>

        {/* Footer */}
        <div className="flex justify-between items-center px-6 py-4 border-t border-slate-200 bg-slate-50 rounded-b-lg">
          <div className="text-xs text-slate-500">
            Audit Forensik Akuntansi &bull; Didukung AI Gemini 3.8 Flash
          </div>
          <button
            type="button"
            onClick={onClose}
            className="rounded bg-slate-200 px-4 py-2 text-xs font-semibold text-slate-700 hover:bg-slate-300"
          >
            Tutup
          </button>
        </div>
      </div>
    </div>
  );
};
