import { Head, Link, router } from '@inertiajs/react';
import {
    AlertTriangle,
    ArrowLeft,
    Calendar,
    CheckCircle2,
    CircleDollarSign,
    ClipboardList,
    MapPin,
    Phone,
    Search,
    User,
    Wallet,
} from 'lucide-react';
import { useCallback, useEffect, useRef, useState } from 'react';

import { Button } from '@/components/ui/button';
import {
    Card,
    CardAction,
    CardContent,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { ConfirmDialog } from '@/components/ui/confirm-dialog';
import { Input } from '@/components/ui/input';
import { Pagination } from '@/components/ui/pagination';
import { StatusBadge } from '@/components/ui/status-badge';
import AppLayout from '@/layouts/app-layout';
import { formatDateID, formatIDR } from '@/lib/formatters';
import { toastError, toastLoading, toastSuccess } from '@/lib/toast';
import dailyCollectionRoutes from '@/routes/daily-collection';
import financingRoutes from '@/routes/financing';
import type { BreadcrumbItem, PaginatedData } from '@/types';
import type { TellerTask } from '@/types/daily-collection';

interface PageProps {
    tasks: PaginatedData<TellerTask>;
    summary: {
        total_tasks: number;
        total_outstanding: number;
    };
    filters: {
        date: string;
        search: string;
    };
}

const breadcrumbs: BreadcrumbItem[] = [
    {
        title: 'Penagihan Harian',
        href: dailyCollectionRoutes.index().url,
    },
    {
        title: 'Mode Teller',
        href: '#',
    },
];

export default function TellerInput({ tasks, summary, filters }: PageProps) {
    const [search, setSearch] = useState(filters.search);
    const [date, setDate] = useState(filters.date);
    const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);

    const navigate = useCallback((newSearch: string, newDate: string) => {
        router.get(
            dailyCollectionRoutes.teller().url,
            { search: newSearch, date: newDate },
            { preserveState: true, preserveScroll: true, replace: true },
        );
    }, []);

    // Debounce search (300 ms)
    useEffect(() => {
        if (debounceRef.current) clearTimeout(debounceRef.current);
        debounceRef.current = setTimeout(() => {
            if (search !== filters.search) {
                navigate(search, date);
            }
        }, 300);
        return () => {
            if (debounceRef.current) clearTimeout(debounceRef.current);
        };
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [search]);

    const handleDateChange = (newDate: string) => {
        setDate(newDate);
        navigate(search, newDate);
    };

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Mode Teller — Penagihan Harian" />

            <div className="flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4">
                {/* ── Header ── */}
                <div className="flex flex-col gap-3">
                    {/* Top row */}
                    <div className="flex items-center gap-3">
                        <Link
                            href={
                                dailyCollectionRoutes.index({
                                    query: { date: filters.date },
                                }).url
                            }
                            className="inline-flex shrink-0 items-center gap-1 rounded-lg border px-3 py-2 text-sm transition-colors hover:bg-muted"
                        >
                            <ArrowLeft className="h-4 w-4" />
                            Kembali
                        </Link>
                        <div className="flex min-w-0 flex-col gap-0.5">
                            <h1 className="truncate text-lg font-black md:text-2xl">
                                Mode Teller — Penagihan Harian
                            </h1>
                            <span className="truncate text-xs text-muted-foreground md:text-sm">
                                Input pembayaran langsung tanpa batas collector
                            </span>
                        </div>
                    </div>

                    {/* Search + date */}
                    <div className="flex flex-col gap-2 sm:flex-row sm:items-center">
                        <div className="relative flex-1">
                            <Search className="absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
                            <input
                                autoFocus
                                type="text"
                                value={search}
                                onChange={(e) => setSearch(e.target.value)}
                                placeholder="Cari nama anggota..."
                                className="h-10 w-full rounded-md border bg-background pr-3 pl-9 text-sm focus:ring-2 focus:ring-ring focus:outline-none"
                            />
                        </div>
                        <div className="flex items-center gap-2 sm:shrink-0">
                            <Calendar className="h-4 w-4 shrink-0 text-muted-foreground" />
                            <Input
                                id="date-picker"
                                type="date"
                                value={date}
                                onChange={(e) =>
                                    handleDateChange(e.target.value)
                                }
                                className="w-full sm:w-44"
                            />
                        </div>
                    </div>
                </div>

                {/* ── Summary strip ── */}
                <div className="grid grid-cols-2 gap-3 md:grid-cols-3">
                    <Card>
                        <CardHeader>
                            <CardTitle>Hasil Pencarian</CardTitle>
                            <CardAction>
                                <ClipboardList className="h-4 w-4" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold">
                                {summary.total_tasks}
                            </div>
                            <p className="text-xs text-muted-foreground">
                                Angsuran jatuh tempo
                            </p>
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader>
                            <CardTitle>Total Tagihan</CardTitle>
                            <CardAction>
                                <CircleDollarSign className="h-4 w-4" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold">
                                {formatIDR(summary.total_outstanding)}
                            </div>
                            <p className="text-xs text-muted-foreground">
                                Outstanding hari ini
                            </p>
                        </CardContent>
                    </Card>

                    <Card className="col-span-2 md:col-span-1">
                        <CardHeader>
                            <CardTitle>Tanggal</CardTitle>
                            <CardAction>
                                <Calendar className="h-4 w-4" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="text-lg font-bold">
                                {formatDateID(date)}
                            </div>
                            <p className="text-xs text-muted-foreground">
                                Tanggal penagihan
                            </p>
                        </CardContent>
                    </Card>
                </div>

                {/* ── Task grid ── */}
                {tasks.data.length > 0 ? (
                    <div className="flex flex-col gap-4">
                        <div className="grid gap-3 md:grid-cols-2 lg:grid-cols-3">
                            {tasks.data.map((task) => (
                                <TellerTaskCard key={task.id} task={task} />
                            ))}
                        </div>
                        {tasks.last_page > 1 && (
                            <div className="mt-4 flex justify-center">
                                <Pagination
                                    currentPage={tasks.current_page}
                                    lastPage={tasks.last_page}
                                />
                            </div>
                        )}
                    </div>
                ) : (
                    <div className="flex flex-col items-center justify-center rounded-xl border border-dashed bg-muted/50 p-12 text-center">
                        <div className="rounded-full bg-muted p-4">
                            {search ? (
                                <Search className="h-8 w-8 text-muted-foreground" />
                            ) : (
                                <CheckCircle2 className="h-8 w-8 text-emerald-600 dark:text-emerald-400" />
                            )}
                        </div>
                        <h3 className="mt-4 text-lg font-semibold">
                            {search ? 'Tidak Ditemukan' : 'Tidak Ada Tugas'}
                        </h3>
                        <p className="mt-2 text-sm text-muted-foreground">
                            {search
                                ? `Tidak ada anggota dengan nama "${search}" yang memiliki angsuran jatuh tempo hari ini.`
                                : 'Tidak ada angsuran yang perlu ditagih pada tanggal ini.'}
                        </p>
                        {search && (
                            <button
                                onClick={() => setSearch('')}
                                className="mt-3 text-sm text-primary hover:underline"
                            >
                                Hapus pencarian
                            </button>
                        )}
                    </div>
                )}
            </div>
        </AppLayout>
    );
}

// ─────────────────────────────────────────────
// Task card
// ─────────────────────────────────────────────
function TellerTaskCard({ task }: { task: TellerTask }) {
    const [showConfirm, setShowConfirm] = useState(false);
    const [isProcessing, setIsProcessing] = useState(false);

    const handlePayment = () => {
        router.post(
            dailyCollectionRoutes.quickPayment(task.id).url,
            {},
            {
                preserveScroll: true,
                onStart: () => {
                    setIsProcessing(true);
                    toastLoading('Memproses pembayaran...');
                },
                onSuccess: () => {
                    toastSuccess('Pembayaran berhasil dicatat');
                    setShowConfirm(false);
                },
                onError: (errors: Record<string, string>) => {
                    toastError(
                        Object.values(errors)[0] ||
                            'Gagal memproses pembayaran',
                    );
                },
                onFinish: () => setIsProcessing(false),
            },
        );
    };

    return (
        <div className="group relative overflow-hidden rounded-xl border bg-card shadow-sm transition-all hover:shadow-md">
            <div className="p-4">
                {/* Member + status */}
                <div className="mb-3 flex items-start justify-between gap-2">
                    <div className="min-w-0">
                        <p className="truncate font-bold">{task.member.name}</p>
                        <Link
                            href={
                                financingRoutes.show({
                                    financing: task.financing.id,
                                }).url
                            }
                            className="text-xs text-primary hover:underline"
                        >
                            {task.financing.account_number}
                        </Link>
                    </div>
                    <StatusBadge type="installment" status={task.status} />
                </div>

                {/* Collector badge */}
                <div className="mb-3">
                    <span className="inline-flex items-center gap-1 rounded-full border bg-muted/60 px-2 py-0.5 text-xs text-muted-foreground">
                        <User className="h-3 w-3" />
                        {task.collector_name}
                    </span>
                </div>

                {/* Contact + address */}
                <div className="mb-3 space-y-1">
                    {task.member.phone !== '-' && (
                        <div className="flex items-center gap-2 text-xs text-muted-foreground">
                            <Phone className="h-3 w-3 shrink-0" />
                            <span>{task.member.phone}</span>
                        </div>
                    )}
                    {task.member.address !== '-' && (
                        <div className="flex items-center gap-2 text-xs text-muted-foreground">
                            <MapPin className="h-3 w-3 shrink-0" />
                            <span className="line-clamp-1">
                                {task.member.address}
                            </span>
                        </div>
                    )}
                </div>

                {/* Payment info */}
                <div className="mb-3 rounded-lg bg-muted/50 p-3">
                    <div className="flex items-center justify-between text-sm">
                        <span className="text-muted-foreground">
                            Angsuran ke-{task.sequence_number}
                        </span>
                        <span className="text-xs text-muted-foreground">
                            {formatDateID(task.due_date)}
                        </span>
                    </div>
                    <div className="mt-1 flex items-center justify-between">
                        <span className="text-sm text-muted-foreground">
                            Harus bayar:
                        </span>
                        <span className="text-lg font-bold text-primary">
                            {formatIDR(task.total_outstanding)}
                        </span>
                    </div>
                    {task.days_overdue > 0 && (
                        <div className="mt-1 flex items-center gap-1 text-xs font-medium text-amber-600 dark:text-amber-400">
                            <AlertTriangle className="h-3 w-3" />
                            Terlambat {task.days_overdue} hari
                        </div>
                    )}
                </div>

                {/* Pay button */}
                <Button
                    className="w-full"
                    size="sm"
                    onClick={() => setShowConfirm(true)}
                >
                    <Wallet className="h-4 w-4" />
                    Bayar {formatIDR(task.total_outstanding)}
                </Button>
            </div>

            <ConfirmDialog
                open={showConfirm}
                onOpenChange={setShowConfirm}
                title="Konfirmasi Pembayaran"
                description={`Proses pembayaran angsuran ke-${task.sequence_number} sebesar ${formatIDR(task.total_outstanding)} untuk ${task.member.name}?`}
                confirmText={
                    isProcessing ? 'Memproses...' : 'Proses Pembayaran'
                }
                onConfirm={handlePayment}
                isLoading={isProcessing}
            />
        </div>
    );
}
