import { Head, Link, router } from '@inertiajs/react';
import {
    AlertTriangle,
    ArrowLeft,
    Calendar,
    CheckCircle2,
    CircleDollarSign,
    ClipboardList,
    Clock,
    MapPin,
    Phone,
    Search,
    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 } from '@/types';
import type {
    CollectionTask,
    CollectorTaskData,
} from '@/types/daily-collection';

interface PageProps {
    taskData: CollectorTaskData;
    filters: {
        date: string;
        search: string;
    };
}

export default function CollectorTasks({ taskData, filters }: PageProps) {
    const { collector, summary, tasks } = taskData;

    const breadcrumbs: BreadcrumbItem[] = [
        {
            title: 'Penagihan Harian',
            href: dailyCollectionRoutes.index().url,
        },
        {
            title: collector?.name ?? 'Collector',
            href: '#',
        },
    ];

    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) => {
            if (collector) {
                router.get(
                    dailyCollectionRoutes.collectorTasks(collector.id).url,
                    { search: newSearch, date: newDate },
                    { preserveState: true, preserveScroll: true, replace: true },
                );
            }
        },
        [collector],
    );

    // 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={`Tugas ${collector?.name ?? 'Collector'} - Penagihan`}
            />

            <div className="flex h-full flex-1 flex-col gap-4 rounded-xl p-3 md:p-4">
                {/* Header */}
                <div className="flex flex-col gap-3">
                    {/* Top row: back button + title */}
                    <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">
                                Tugas {collector?.name ?? 'Collector'}
                            </h1>
                            <span className="truncate text-xs text-muted-foreground md:text-sm">
                                {formatDateID(filters.date)}
                            </span>
                        </div>
                    </div>

                    {/* Bottom row: search + date — full width on mobile */}
                    <div className="flex flex-col gap-2 sm:flex-row sm:items-center">
                        {/* Search */}
                        <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
                                type="text"
                                value={search}
                                onChange={(e) => setSearch(e.target.value)}
                                placeholder="Cari nama anggota..."
                                className="h-9 w-full rounded-md border bg-background pr-3 pl-9 text-sm focus:ring-1 focus:ring-ring focus:outline-none"
                            />
                        </div>
                        {/* Date picker */}
                        <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-40"
                            />
                        </div>
                    </div>
                </div>

                {/* Stats Cards — 2x2 on mobile, 4-col on md+ */}
                <div className="grid grid-cols-2 gap-3 md:grid-cols-4">
                    <Card>
                        <CardHeader>
                            <CardTitle>Tugas Hari Ini</CardTitle>
                            <CardAction>
                                <ClipboardList className="h-4 w-4" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold">
                                {summary.today_tasks}
                            </div>
                            <p className="text-xs text-muted-foreground">
                                Angsuran jatuh tempo
                            </p>
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader>
                            <CardTitle>Tunggakan</CardTitle>
                            <CardAction>
                                <AlertTriangle className="h-4 w-4 text-amber-500" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold text-amber-600 dark:text-amber-400">
                                {summary.overdue_tasks}
                            </div>
                            <p className="text-xs text-muted-foreground">
                                Belum dibayar
                            </p>
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader>
                            <CardTitle>Target Total Penagihan</CardTitle>
                            <CardAction>
                                <CircleDollarSign className="h-4 w-4" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold">
                                {formatIDR(summary.total_expected)}
                            </div>
                            <p className="text-xs text-muted-foreground">
                                Total yang harus ditagih
                            </p>
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader>
                            <CardTitle>Terkumpul</CardTitle>
                            <CardAction>
                                <CheckCircle2 className="h-4 w-4" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold text-emerald-600 dark:text-emerald-400">
                                {formatIDR(summary.collected_today)}
                            </div>
                            <p className="text-xs text-muted-foreground">
                                Sisa:{' '}
                                {formatIDR(
                                    summary.total_expected -
                                        summary.collected_today,
                                )}
                            </p>
                        </CardContent>
                    </Card>
                </div>

                {/* Task List */}
                {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) => (
                                <TaskCard
                                    key={task.id}
                                    task={task}
                                    isOverdue={task.due_date < filters.date}
                                />
                            ))}
                        </div>
                        {tasks.last_page > 1 && (
                            <div className="mt-4 flex justify-center pb-6">
                                <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-emerald-100 p-4 dark:bg-emerald-900/30">
                            {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}".`
                                : '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>
    );
}

function TaskCard({
    task,
    isOverdue = false,
}: {
    task: CollectionTask;
    isOverdue?: boolean;
}) {
    const [showConfirmModal, setShowConfirmModal] = 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');
                    setShowConfirmModal(false);
                },
                onError: (errors: Record<string, string>) => {
                    // console.error('Payment error:', errors);
                    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 ${
                isOverdue ? 'border-amber-200 dark:border-amber-800/50' : ''
            }`}
        >
            {/* Overdue indicator */}
            {isOverdue && task.days_overdue > 0 && (
                <div className="bg-amber-500 px-3 py-1 text-center text-xs font-medium text-white">
                    Terlambat {task.days_overdue} hari
                </div>
            )}

            <div className="p-4">
                {/* Member Info + Status */}
                <div className="mb-3 flex items-start justify-between">
                    <div>
                        <p className="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>

                {/* 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" />
                            <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" />
                            <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>
                </div>

                {/* Quick Pay button */}
                {task.status !== 'paid' && (
                    <>
                        <Button
                            className="w-full"
                            size="sm"
                            onClick={() => setShowConfirmModal(true)}
                        >
                            <Wallet className="h-4 w-4" />
                            Bayar {formatIDR(task.total_outstanding)}
                        </Button>

                        <ConfirmDialog
                            open={showConfirmModal}
                            onOpenChange={setShowConfirmModal}
                            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>
        </div>
    );
}
