import { Head, useForm } from '@inertiajs/react';
import {
    AlertCircle,
    ArrowRight,
    Calculator,
    CheckCircle2,
    Info,
} from 'lucide-react';
import { useMemo } from 'react';

import { Alert, AlertDescription } from '@/components/ui/alert';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Textarea } from '@/components/ui/textarea';
import AppLayout from '@/layouts/app-layout';
import { formatIDR } from '@/lib/formatters';
import type { BreadcrumbItem } from '@/types';

interface Props {
    date: string;
    systemBalance: number;
    denominations: number[];
    alreadySubmitted: boolean;
    existingRecord: { id: number } | null;
}

const breadcrumbs: BreadcrumbItem[] = [
    { title: 'Kas & Teller', href: '/cash-counts' },
    { title: 'Hitung Kas Harian', href: '/cash-counts/create' },
];

const DENOMINATION_LABELS: Record<number, string> = {
    1000: 'Rp 1.000',
    2000: 'Rp 2.000',
    5000: 'Rp 5.000',
    10000: 'Rp 10.000',
    20000: 'Rp 20.000',
    50000: 'Rp 50.000',
    100000: 'Rp 100.000',
};

export default function Create({
    date,
    systemBalance,
    denominations,
    alreadySubmitted,
    existingRecord,
}: Props) {
    const { data, setData, post, processing, errors } = useForm({
        date,
        system_balance: systemBalance,
        details: [...denominations]
            .sort((a, b) => b - a)
            .map((d) => ({
                denomination: d,
                quantity: 0,
            })),
        note: '',
    });

    console.log(data.system_balance);

    // Auto-calculate totals
    const physicalTotal = useMemo(
        () =>
            data.details.reduce(
                (sum, item) => sum + item.denomination * (item.quantity || 0),
                0,
            ),
        [data.details],
    );

    const difference = physicalTotal - systemBalance;

    const status: 'balanced' | 'over' | 'short' =
        difference === 0 ? 'balanced' : difference > 0 ? 'over' : 'short';

    const isNoteRequired = difference !== 0;
    const isQuantityEmpty = data.details.every(
        (d) => !d.quantity || d.quantity === 0,
    );
    const isSubmitDisabled =
        processing ||
        isQuantityEmpty ||
        (isNoteRequired && data.note.trim() === '');

    const handleQuantityChange = (index: number, value: string) => {
        const qty = parseInt(value, 10);
        const updated = data.details.map((item, i) =>
            i === index ? { ...item, quantity: isNaN(qty) ? 0 : qty } : item,
        );
        setData('details', updated);
    };

    const handleSubmit = (e: React.FormEvent) => {
        e.preventDefault();
        post('/cash-counts', { preserveScroll: true });
    };

    const statusConfig = {
        balanced: {
            label: 'Seimbang',
            color: 'bg-emerald-100 text-emerald-800 border-emerald-200',
            icon: <CheckCircle2 className="h-3.5 w-3.5" />,
        },
        over: {
            label: 'Lebih',
            color: 'bg-amber-100 text-amber-800 border-amber-200',
            icon: <AlertCircle className="h-3.5 w-3.5" />,
        },
        short: {
            label: 'Kurang',
            color: 'bg-red-100 text-red-800 border-red-200',
            icon: <AlertCircle className="h-3.5 w-3.5" />,
        },
    };

    const currentStatus = statusConfig[status];

    if (alreadySubmitted && existingRecord) {
        return (
            <AppLayout breadcrumbs={breadcrumbs}>
                <Head title="Hitung Kas Harian" />
                <div className="flex h-full flex-1 flex-col items-center justify-center gap-4 p-6">
                    <div className="flex max-w-md flex-col items-center gap-4 text-center">
                        <div className="rounded-full bg-emerald-100 p-4">
                            <CheckCircle2 className="h-10 w-10 text-emerald-600" />
                        </div>
                        <div>
                            <h1 className="text-2xl font-bold">
                                Sudah Disubmit
                            </h1>
                            <p className="mt-1 text-muted-foreground">
                                Hitung kas untuk tanggal <strong>{date}</strong>{' '}
                                sudah pernah disubmit dan tidak dapat diubah.
                            </p>
                        </div>
                        <Button asChild className="gap-2">
                            <a href={`/cash-counts/${existingRecord.id}`}>
                                Lihat Hasil Hitung Kas
                                <ArrowRight className="h-4 w-4" />
                            </a>
                        </Button>
                    </div>
                </div>
            </AppLayout>
        );
    }

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Hitung Kas Harian" />

            <div className="flex h-full flex-1 flex-col gap-6 p-4 md:p-6">
                {/* Page Header */}
                <div className="flex items-center justify-between">
                    <div className="flex flex-col gap-1">
                        <h1 className="text-2xl font-black">
                            Hitung Kas Fisik Harian
                        </h1>
                        <span className="text-sm text-muted-foreground">
                            Catat jumlah lembar uang fisik untuk tanggal{' '}
                            <strong>{date}</strong>
                        </span>
                    </div>
                    <div className="flex items-center gap-2 rounded-lg border bg-muted px-3 py-2 text-sm">
                        <Calculator className="h-4 w-4 text-muted-foreground" />
                        <span className="text-muted-foreground">
                            Perhitungan otomatis
                        </span>
                    </div>
                </div>

                <form onSubmit={handleSubmit}>
                    <div className="grid gap-6 lg:grid-cols-3">
                        {/* Denomination Input Table */}
                        <div className="lg:col-span-2">
                            <Card>
                                <CardHeader>
                                    <CardTitle className="text-base">
                                        Input Lembar Uang
                                    </CardTitle>
                                </CardHeader>
                                <CardContent>
                                    <div className="overflow-x-auto">
                                        <table className="w-full text-sm">
                                            <thead>
                                                <tr className="border-b text-muted-foreground">
                                                    <th className="pb-3 text-left font-medium">
                                                        Pecahan
                                                    </th>
                                                    <th className="pb-3 text-center font-medium">
                                                        Jumlah Lembar
                                                    </th>
                                                    <th className="pb-3 text-right font-medium">
                                                        Subtotal
                                                    </th>
                                                </tr>
                                            </thead>
                                            <tbody className="divide-y">
                                                {data.details.map(
                                                    (item, index) => {
                                                        const subtotal =
                                                            item.denomination *
                                                            (item.quantity ||
                                                                0);
                                                        return (
                                                            <tr
                                                                key={
                                                                    item.denomination
                                                                }
                                                                className="transition-colors hover:bg-muted/30"
                                                            >
                                                                <td className="py-3 font-medium">
                                                                    <div className="flex items-center gap-2">
                                                                        <div className="h-2 w-2 rounded-full bg-primary/60" />
                                                                        {
                                                                            DENOMINATION_LABELS[
                                                                                item
                                                                                    .denomination
                                                                            ]
                                                                        }
                                                                    </div>
                                                                </td>
                                                                <td className="py-3">
                                                                    <div className="flex justify-center">
                                                                        <Input
                                                                            id={`qty-${item.denomination}`}
                                                                            type="number"
                                                                            min="0"
                                                                            className="h-9 w-28 text-center"
                                                                            value={
                                                                                item.quantity ||
                                                                                ''
                                                                            }
                                                                            placeholder="0"
                                                                            onChange={(
                                                                                e,
                                                                            ) =>
                                                                                handleQuantityChange(
                                                                                    index,
                                                                                    e
                                                                                        .target
                                                                                        .value,
                                                                                )
                                                                            }
                                                                        />
                                                                    </div>
                                                                </td>
                                                                <td className="py-3 text-right font-medium tabular-nums">
                                                                    {subtotal >
                                                                    0 ? (
                                                                        <span className="text-primary">
                                                                            {formatIDR(
                                                                                subtotal,
                                                                            )}
                                                                        </span>
                                                                    ) : (
                                                                        <span className="text-muted-foreground">
                                                                            —
                                                                        </span>
                                                                    )}
                                                                </td>
                                                            </tr>
                                                        );
                                                    },
                                                )}
                                            </tbody>
                                            <tfoot>
                                                <tr className="border-t-2 bg-muted/20">
                                                    <td
                                                        colSpan={2}
                                                        className="py-3 font-bold"
                                                    >
                                                        Total Kas Fisik
                                                    </td>
                                                    <td className="py-3 text-right text-lg font-bold text-primary tabular-nums">
                                                        {formatIDR(
                                                            physicalTotal,
                                                        )}
                                                    </td>
                                                </tr>
                                            </tfoot>
                                        </table>
                                    </div>

                                    {errors.details && (
                                        <p className="mt-2 text-sm text-destructive">
                                            {errors.details}
                                        </p>
                                    )}
                                </CardContent>
                            </Card>
                        </div>

                        {/* Summary Panel */}
                        <div className="flex flex-col gap-4">
                            {/* Summary Card */}
                            <Card className="border-2">
                                <CardHeader className="pb-3">
                                    <CardTitle className="text-base">
                                        Ringkasan
                                    </CardTitle>
                                </CardHeader>
                                <CardContent className="flex flex-col gap-4">
                                    {/* System Balance */}
                                    <div className="rounded-lg bg-muted/40 p-3">
                                        <div className="flex items-center gap-2 text-xs text-muted-foreground">
                                            <Info className="h-3.5 w-3.5" />
                                            Saldo Kas Sistem
                                        </div>
                                        <div className="mt-1 text-xl font-bold tabular-nums">
                                            {formatIDR(systemBalance)}
                                        </div>
                                    </div>

                                    {/* Physical Total */}
                                    <div>
                                        <div className="text-xs text-muted-foreground">
                                            Total Kas Fisik
                                        </div>
                                        <div className="mt-1 text-2xl font-black text-primary tabular-nums">
                                            {formatIDR(physicalTotal)}
                                        </div>
                                    </div>

                                    <hr />

                                    {/* Difference */}
                                    <div>
                                        <div className="text-xs text-muted-foreground">
                                            Selisih
                                        </div>
                                        <div
                                            className={`mt-1 text-xl font-bold tabular-nums ${
                                                difference === 0
                                                    ? 'text-emerald-600'
                                                    : difference > 0
                                                      ? 'text-amber-600'
                                                      : 'text-red-600'
                                            }`}
                                        >
                                            {difference >= 0 ? '+' : ''}
                                            {formatIDR(difference)}
                                        </div>
                                    </div>

                                    {/* Status Badge */}
                                    <div>
                                        <div className="text-xs text-muted-foreground">
                                            Status
                                        </div>
                                        <div className="mt-1">
                                            <span
                                                className={`inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-semibold ${currentStatus.color}`}
                                            >
                                                {currentStatus.icon}
                                                {currentStatus.label}
                                            </span>
                                        </div>
                                    </div>
                                </CardContent>
                            </Card>

                            {/* Note Field - only shown if discrepancy */}
                            {isNoteRequired && (
                                <Card className="border-amber-200 bg-amber-50 dark:bg-amber-950/20">
                                    <CardContent className="pt-4">
                                        <Alert className="mb-3 border-amber-300 bg-amber-100">
                                            <AlertCircle className="h-4 w-4 text-amber-600" />
                                            <AlertDescription className="text-xs text-amber-700">
                                                Ada selisih kas. Keterangan
                                                wajib diisi.
                                            </AlertDescription>
                                        </Alert>
                                        <div className="flex flex-col gap-2">
                                            <Label
                                                htmlFor="note"
                                                className="text-sm font-medium"
                                            >
                                                Keterangan Selisih{' '}
                                                <span className="text-destructive">
                                                    *
                                                </span>
                                            </Label>
                                            <Textarea
                                                id="note"
                                                placeholder="Jelaskan penyebab selisih kas..."
                                                rows={3}
                                                value={data.note}
                                                onChange={(e) =>
                                                    setData(
                                                        'note',
                                                        e.target.value,
                                                    )
                                                }
                                                className={
                                                    errors.note
                                                        ? 'border-destructive'
                                                        : ''
                                                }
                                            />
                                            {errors.note && (
                                                <p className="text-xs text-destructive">
                                                    {errors.note}
                                                </p>
                                            )}
                                        </div>
                                    </CardContent>
                                </Card>
                            )}

                            {/* Server-side error */}
                            {(errors as Record<string, string>).store && (
                                <Alert variant="destructive">
                                    <AlertCircle className="h-4 w-4" />
                                    <AlertDescription>
                                        {
                                            (errors as Record<string, string>)
                                                .store
                                        }
                                    </AlertDescription>
                                </Alert>
                            )}

                            {/* Submit Button */}
                            <Button
                                type="submit"
                                size="lg"
                                disabled={isSubmitDisabled}
                                className="w-full gap-2"
                            >
                                {processing ? (
                                    <>Menyimpan...</>
                                ) : (
                                    <>
                                        <CheckCircle2 className="h-4 w-4" />
                                        Submit Hitung Kas
                                    </>
                                )}
                            </Button>

                            {isQuantityEmpty && (
                                <p className="text-center text-xs text-muted-foreground">
                                    Isi minimal satu pecahan untuk melanjutkan
                                </p>
                            )}
                        </div>
                    </div>
                </form>
            </div>
        </AppLayout>
    );
}
