import AsyncSelect from '@/Components/AsyncSelect';
import { useConfirm } from '@/Components/ConfirmDialog';
import DatePicker from '@/Components/DatePicker';
import DateTimeRangePicker from '@/Components/DateTimeRangePicker';
import MoneyInput from '@/Components/MoneyInput';
import Select from '@/Components/Select';
import AppLayout from '@/Layouts/AppLayout';
import { paraFormat, tarihFormat } from '@/lib/format';
import Link from '@/Components/Link';
import { Head, router, useForm } from '@inertiajs/react';
import { ArrowLeft, Plus, Trash2, Wallet, AlertCircle } from 'lucide-react';
import { FormEvent, useState } from 'react';

interface Odeme {
    id: number;
    tarih: string;
    tutar: number | string;
    para_birimi: string;
    aciklama?: string;
    donem_baslangic?: string;
    donem_bitis?: string;
    odeme_turu?: { id: number; ad: string } | null;
}

interface Personel {
    id: number;
    ad: string;
    soyad: string;
    saatlik_ucret: number | string;
    para_birimi: string;
}

interface Props {
    personel: Personel;
    odemeler: Odeme[];
    baslangic: string;
    bitis: string;
    netBorc: number;
    odemeTurleri: { id: number; ad: string }[];
}

export default function OdemeYonet({ personel, odemeler, baslangic, bitis, netBorc, odemeTurleri }: Props) {
    const [bas, setBas] = useState(baslangic);
    const [bit, setBit] = useState(bitis);

    const filtrele = (e: FormEvent) => {
        e.preventDefault();
        router.get(`/personeller/${personel.id}/odeme/`, { baslangic: bas, bitis: bit });
    };

    const { data, setData, post, processing, reset } = useForm({
        tarih: new Date().toISOString().slice(0, 10),
        tutar: 0,
        odeme_tur_id: '',
        donem_baslangic: '',
        donem_bitis: '',
        aciklama: '',
    });

    const ekle = (e: FormEvent) => {
        e.preventDefault();
        post(`/personeller/${personel.id}/odeme`, {
            preserveScroll: true,
            onSuccess: () => {
                setData('tutar', 0);
                setData('aciklama', '');
                setData('donem_baslangic', '');
                setData('donem_bitis', '');
            },
        });
    };

    const confirm = useConfirm();
    const sil = async (o: Odeme) => {
        const onay = await confirm({
            tip: 'tehlike', baslik: 'Ödemeyi Sil',
            mesaj: <>{tarihFormat(o.tarih)} tarihli, <strong>{paraFormat(o.tutar, o.para_birimi)}</strong> tutarlı ödeme silinsin mi?</>,
            detay: 'Ödeme kaydı kalıcı olarak silinir.',
            onayMetni: 'Sil',
        });
        if (!onay) return;
        router.delete(`/personeller/${personel.id}/odeme/${o.id}/`, { preserveScroll: true });
    };

    const toplamOdeme = odemeler.reduce((t, o) => t + parseFloat(o.tutar as string), 0);

    return (
        <AppLayout title={`Ödeme: ${personel.ad} ${personel.soyad}`}>
            <Head title="Personel Ödemeleri" />

            <Link href="/personeller/" className="mb-4 inline-flex items-center gap-1 text-sm font-medium text-slate-600 hover:text-slate-900">
                <ArrowLeft className="h-4 w-4" />
                Personeller
            </Link>

            {/* PERSONEL OZET */}
            <div className="mb-4 rounded-xl border border-slate-200 bg-white p-5 shadow-sm">
                <div className="flex items-center justify-between gap-4">
                    <div className="flex items-center gap-4">
                        <div className="flex h-12 w-12 items-center justify-center rounded-full bg-blue-600 text-lg font-semibold text-white">
                            {personel.ad.charAt(0)}{personel.soyad.charAt(0)}
                        </div>
                        <div>
                            <h2 className="text-lg font-semibold text-slate-900">{personel.ad} {personel.soyad}</h2>
                            <p className="text-sm text-slate-600">
                                Saatlik: {paraFormat(personel.saatlik_ucret, personel.para_birimi)}
                            </p>
                        </div>
                    </div>
                    <div className="text-right">
                        <div className="text-xs uppercase text-slate-500">Net Borç</div>
                        <div className={`text-2xl font-bold ${netBorc > 0 ? 'text-rose-700' : netBorc < 0 ? 'text-emerald-700' : 'text-slate-700'}`}>
                            {paraFormat(Math.abs(netBorc))}
                        </div>
                        <div className="text-xs text-slate-500">
                            {netBorc > 0 ? 'Personele ödenecek' : netBorc < 0 ? 'Avans verildi' : 'Sıfır'}
                        </div>
                    </div>
                </div>
            </div>

            {/* TARIH FILTRESI + OZET KARTLAR */}
            <div className="mb-4 grid grid-cols-1 gap-4 lg:grid-cols-2">
                <form onSubmit={filtrele} className="flex items-end gap-2 rounded-xl border border-slate-200 bg-white p-4 shadow-sm">
                    <div className="min-w-[280px] flex-1"><DateTimeRangePicker baslangic={bas} onBaslangicChange={setBas} bitis={bit} onBitisChange={setBit} /></div>
                    <button type="submit" className="rounded-lg bg-slate-900 px-4 py-2 text-sm font-semibold text-white hover:bg-slate-800">
                        Filtrele
                    </button>
                </form>

                <div className="grid grid-cols-2 gap-4">
                    <div className="rounded-xl border border-slate-200 bg-white p-4 shadow-sm">
                        <div className="text-xs font-medium text-slate-600">Bu Dönemde</div>
                        <div className="mt-1 text-xl font-bold text-slate-900">{odemeler.length} ödeme</div>
                    </div>
                    <div className="rounded-xl border border-blue-200 bg-blue-50 p-4 shadow-sm">
                        <div className="text-xs font-medium text-blue-700">Toplam Ödeme</div>
                        <div className="mt-1 text-xl font-bold text-blue-700">{paraFormat(toplamOdeme)}</div>
                    </div>
                </div>
            </div>

            {/* YENI ODEME FORMU */}
            <form onSubmit={ekle} className="mb-4 rounded-xl border border-emerald-200 bg-emerald-50 p-4 shadow-sm">
                <h3 className="mb-3 flex items-center gap-2 text-sm font-semibold text-emerald-900">
                    <Plus className="h-4 w-4" />
                    Yeni Ödeme Yap
                </h3>
                <div className="flex flex-wrap items-end gap-3">
                    <div className="w-[140px] flex-shrink-0">
                        <label className="mb-1 block text-xs font-medium text-slate-600">Tarih</label>
                        <DatePicker value={data.tarih} onChange={(v) => setData('tarih', v)} placeholder="Ödeme tarihi" />
                    </div>
                    <div className="w-[130px] flex-shrink-0">
                        <label className="mb-1 block text-xs font-medium text-slate-600">Tutar</label>
                        <MoneyInput
                            value={data.tutar}
                            onChange={(v) => setData('tutar', v)}
                            currency={personel.para_birimi}
                            placeholder="0,00"
                        />
                    </div>
                    <div className="min-w-[150px] flex-1">
                        <label className="mb-1 block text-xs font-medium text-slate-600">Tür</label>
                        <Select
                            value={data.odeme_tur_id}
                            onChange={(v) => setData('odeme_tur_id', String(v))}
                            options={[
                                { value: '', label: '(Belirtilmedi)' },
                                ...odemeTurleri.map((t) => ({ value: t.id, label: t.ad })),
                            ]}
                            placeholder="Ödeme türü seçiniz..."
                            hizliEkleUrl="/tanimlamalar/tip/odeme-turu"
                            hizliEkleBaslik="Ödeme Türü"
                            onHizliEklendi={() => router.reload({ only: ['odemeTurleri'] })}
                        />
                    </div>
                    <div className="w-[130px] flex-shrink-0">
                        <label className="mb-1 block text-xs font-medium text-slate-600">Dönem Baş</label>
                        <DatePicker value={data.donem_baslangic} onChange={(v) => setData('donem_baslangic', v)} clearable placeholder="Dönem başlangıcı" />
                    </div>
                    <div className="w-[130px] flex-shrink-0">
                        <label className="mb-1 block text-xs font-medium text-slate-600">Dönem Bit</label>
                        <DatePicker value={data.donem_bitis} onChange={(v) => setData('donem_bitis', v)} clearable placeholder="Dönem bitişi" />
                    </div>
                    <div className="min-w-[180px] flex-1">
                        <label className="mb-1 block text-xs font-medium text-slate-600">Açıklama</label>
                        <input type="text" value={data.aciklama} onChange={(e) => setData('aciklama', e.target.value)}
                            placeholder="Açıklama..."
                            className="w-full rounded-lg border-slate-300 text-sm" />
                    </div>
                    <div className="flex-shrink-0">
                        <button type="submit" disabled={processing}
                            className="inline-flex h-10 items-center gap-2 rounded-lg bg-emerald-600 px-4 text-sm font-semibold text-white shadow-sm hover:bg-emerald-700 disabled:opacity-50">
                            <Wallet className="h-4 w-4" />
                            Öde
                        </button>
                    </div>
                </div>
            </form>

            {/* ODEME LISTESI */}
            <div className="overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm">
                <div className="overflow-x-auto">
                    <table className="w-full">
                        <thead className="bg-slate-50 text-xs uppercase text-slate-600">
                            <tr>
                                <th className="px-4 py-3 text-left">Tarih</th>
                                <th className="px-4 py-3 text-right">Tutar</th>
                                <th className="px-4 py-3 text-left">Tür</th>
                                <th className="px-4 py-3 text-left">Dönem</th>
                                <th className="px-4 py-3 text-left">Açıklama</th>
                                <th className="px-4 py-3 text-right">İşlem</th>
                            </tr>
                        </thead>
                        <tbody className="divide-y divide-slate-200 text-sm">
                            {odemeler.length === 0 ? (
                                <tr><td colSpan={7} className="px-5 py-8 text-center text-slate-500">Bu dönemde ödeme yok.</td></tr>
                            ) : (
                                odemeler.map((o) => (
                                    <tr key={o.id} className="hover:bg-slate-50">
                                        <td className="px-5 py-3 text-slate-700">{tarihFormat(o.tarih)}</td>
                                        <td className="px-5 py-3 text-right font-semibold text-emerald-700">
                                            {paraFormat(o.tutar, o.para_birimi)}
                                        </td>
                                        <td className="px-5 py-3">
                                            {o.odeme_turu ? (
                                                <span className="inline-flex rounded-full bg-blue-50 px-2 py-0.5 text-xs font-medium text-blue-700">
                                                    {o.odeme_turu.ad}
                                                </span>
                                            ) : <span className="text-slate-400">-</span>}
                                        </td>
                                        <td className="px-5 py-3 text-xs text-slate-600">
                                            {o.donem_baslangic && o.donem_bitis
                                                ? `${tarihFormat(o.donem_baslangic)} - ${tarihFormat(o.donem_bitis)}`
                                                : '-'}
                                        </td>
                                        <td className="px-5 py-3 text-slate-600">{o.aciklama || '-'}</td>
                                        <td className="px-5 py-3 text-right">
                                            <button onClick={() => sil(o)} className="rounded-md p-1.5 text-slate-600 hover:bg-rose-50 hover:text-rose-700">
                                                <Trash2 className="h-4 w-4" />
                                            </button>
                                        </td>
                                    </tr>
                                ))
                            )}
                        </tbody>
                    </table>
                </div>
            </div>

        </AppLayout>
    );
}
