import { Deferred, Head, Link, usePage } from '@inertiajs/react';
import {
    AlertTriangle,
    Banknote,
    CircleDollarSign,
    FileText,
    PiggyBank,
    TrendingUp,
    Users2,
    Wallet,
} from 'lucide-react';

import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import {
    Card,
    CardAction,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';

import { usePermissions } from '@/hooks/use-permissions';
import AppLayout from '@/layouts/app-layout';
import { formatIDR } from '@/lib/formatters';
import { dashboard } from '@/routes';
import accounting from '@/routes/accounting';
import dailyCollection from '@/routes/daily-collection';
import financing from '@/routes/financing';
import members from '@/routes/members';
import type { BreadcrumbItem, DashboardPageProps, SharedData } from '@/types';

const breadcrumbs: BreadcrumbItem[] = [
    {
        title: 'Dashboard',
        href: dashboard().url,
    },
];

// ─── NPF Helpers ─────────────────────────────────────────────

function npfColor(ratio: number | undefined): string {
    if (ratio === undefined) return 'text-muted-foreground';
    if (ratio < 5) return 'text-green-600';
    if (ratio <= 10) return 'text-yellow-600';
    return 'text-red-600';
}

function npfBadgeVariant(
    ratio: number | undefined,
): 'default' | 'secondary' | 'destructive' | 'outline' {
    if (ratio === undefined) return 'outline';
    if (ratio < 5) return 'default';
    if (ratio <= 10) return 'secondary';
    return 'destructive';
}

// ─── Page ────────────────────────────────────────────────────
export default function Dashboard({
    stats,
    overdue_count,
    today_collections,
    npf_ratio,
    recent_activities,
    pending_approvals,
}: DashboardPageProps) {
    const { auth } = usePage<SharedData>().props;
    const { can } = usePermissions();

    const actions = [
        {
            title: 'Anggota Baru',
            icon: <Users2 />,
            href: members.create().url,
            permission: 'members.create',
        },
        {
            title: 'Pembiayaan Baru',
            icon: <FileText />,
            href: financing.create().url,
            permission: 'financing.create',
        },
        {
            title: 'Jurnal Entry',
            icon: <TrendingUp />,
            href: accounting.journal.create().url,
            permission: 'accounting.create_journal',
        },
    ].filter((action) => can(action.permission));

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Dashboard" />
            <div className="flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4">
                {/* Welcome */}
                <div className="flex flex-col gap-1">
                    <h1 className="text-2xl font-black">
                        Selamat Datang, {auth.user.name}
                    </h1>
                    <span className="text-sm text-muted-foreground">
                        Berikut ringkasan koperasi hari ini.
                    </span>
                </div>

                {/* Quick Actions */}
                {actions.length > 0 && (
                    <div className="flex flex-row flex-wrap gap-2">
                        {actions.map((action, i) => (
                            <Button
                                key={i}
                                asChild
                                className="gap-3 rounded-lg border-slate-400"
                                variant="outline"
                                size="lg"
                            >
                                <Link href={action.href}>
                                    {action.icon}
                                    {action.title}
                                </Link>
                            </Button>
                        ))}
                    </div>
                )}

                <div className="grid grid-cols-1 gap-2 sm:grid-cols-2 lg:grid-cols-2">
                    {/* 2. Total Savings */}
                    <Card>
                        <CardHeader>
                            <CardTitle>Total Simpanan</CardTitle>
                            <CardAction>
                                <PiggyBank className="h-4 w-4 text-muted-foreground" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="flex overflow-hidden text-2xl font-bold">
                                {formatIDR(stats.savings.total_balance)}
                            </div>
                            <CardDescription className="pt-2">
                                <span className="text-xs text-muted-foreground">
                                    {stats.savings.accounts_count.toLocaleString(
                                        'id-ID',
                                    )}{' '}
                                    rekening aktif
                                </span>
                            </CardDescription>
                        </CardContent>
                    </Card>

                    {/* 3. Active Financings */}
                    <Card>
                        <CardHeader>
                            <CardTitle>Pembiayaan Aktif</CardTitle>
                            <CardAction>
                                <CircleDollarSign className="h-4 w-4 text-muted-foreground" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold">
                                {stats.financing.active_count.toLocaleString(
                                    'id-ID',
                                )}
                            </div>
                            <CardDescription className="flex flex-col items-start gap-1 pt-2">
                                <span className="text-xs text-muted-foreground">
                                    Overdue:{' '}
                                    <span className="font-semibold text-red-600">
                                        {overdue_count}
                                    </span>{' '}
                                    · Pengajuan:{' '}
                                    <span className="font-semibold text-blue-600">
                                        {stats.financing.proposed_count}
                                    </span>
                                </span>
                                <span className="text-xs text-muted-foreground">
                                    Portfolio:{' '}
                                    <span className="font-medium">
                                        {formatIDR(
                                            stats.financing.total_portfolio,
                                        )}
                                    </span>
                                </span>
                            </CardDescription>
                        </CardContent>
                    </Card>
                </div>

                {/* ── KPI Cards ─────────────────────────────── */}
                <div className="grid grid-cols-1 gap-2 sm:grid-cols-2 lg:grid-cols-3">
                    {/* 1. Total Members */}
                    <Card>
                        <CardHeader>
                            <CardTitle>Total Anggota</CardTitle>
                            <CardAction>
                                <Users2 className="h-4 w-4 text-muted-foreground" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold">
                                {stats.members.total.toLocaleString('id-ID')}
                            </div>
                            <CardDescription className="flex flex-col items-start gap-1 pt-2">
                                <span className="text-xs text-muted-foreground">
                                    Terverifikasi:{' '}
                                    <span className="font-semibold text-green-600">
                                        {stats.members.active}
                                    </span>{' '}
                                    · Belum:{' '}
                                    <span className="font-semibold text-yellow-600">
                                        {stats.members.unverified}
                                    </span>
                                </span>
                                {stats.members.new_this_month > 0 && (
                                    <span className="text-xs font-medium text-green-600">
                                        +{stats.members.new_this_month} bulan
                                        ini
                                    </span>
                                )}
                            </CardDescription>
                        </CardContent>
                    </Card>

                    {/* 4. NPF Ratio */}
                    <Card>
                        <CardHeader>
                            <CardTitle>Rasio NPF</CardTitle>
                            <CardAction>
                                <AlertTriangle className="h-4 w-4 text-muted-foreground" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <Deferred
                                data="npf_ratio"
                                fallback={
                                    <div className="h-8 w-16 animate-pulse rounded bg-muted" />
                                }
                            >
                                <div
                                    className={`text-2xl font-bold ${npfColor(npf_ratio)}`}
                                >
                                    {npf_ratio?.toFixed(2) ?? '0.00'}%
                                </div>
                            </Deferred>
                            <CardDescription className="flex items-center gap-2 pt-2">
                                <Badge variant={npfBadgeVariant(npf_ratio)}>
                                    Target &lt; 5%
                                </Badge>
                            </CardDescription>
                        </CardContent>
                    </Card>

                    {/* 5. Today's Collections */}
                    <Card>
                        <CardHeader>
                            <CardTitle>Tagihan Hari Ini</CardTitle>
                            <CardAction>
                                <Wallet className="h-4 w-4 text-muted-foreground" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="text-2xl font-bold">
                                {formatIDR(today_collections)}
                            </div>
                            <CardDescription className="pt-2">
                                <span className="text-xs text-muted-foreground">
                                    Total pembayaran diterima hari ini
                                </span>
                            </CardDescription>
                        </CardContent>
                    </Card>
                </div>

                {/* ── Bottom Section ────────────────────────── */}
                <div className="grid grid-cols-1 gap-4 lg:grid-cols-3">
                    {/* Portfolio Summary */}
                    <Card className="lg:col-span-2">
                        <CardHeader>
                            <CardTitle>Ringkasan Portfolio</CardTitle>
                            <CardAction>
                                <Banknote className="h-4 w-4 text-muted-foreground" />
                            </CardAction>
                        </CardHeader>
                        <CardContent>
                            <div className="grid grid-cols-2 gap-4 sm:grid-cols-2">
                                <div className="space-y-1">
                                    <p className="text-xs text-muted-foreground">
                                        Total Anggota
                                    </p>
                                    <p className="text-lg font-bold">
                                        {stats.members.total.toLocaleString(
                                            'id-ID',
                                        )}
                                    </p>
                                </div>
                                <div className="space-y-1">
                                    <p className="text-xs text-muted-foreground">
                                        Total Simpanan
                                    </p>
                                    <p className="text-lg font-bold">
                                        {formatIDR(stats.savings.total_balance)}
                                    </p>
                                </div>
                                <div className="space-y-1">
                                    <p className="text-xs text-muted-foreground">
                                        Portfolio Pembiayaan
                                    </p>
                                    <p className="text-lg font-bold">
                                        {formatIDR(
                                            stats.financing.total_portfolio,
                                        )}
                                    </p>
                                </div>
                                <div className="space-y-1">
                                    <p className="text-xs text-muted-foreground">
                                        Rasio NPF
                                    </p>
                                    <Deferred
                                        data="npf_ratio"
                                        fallback={
                                            <div className="h-6 w-12 animate-pulse rounded bg-muted" />
                                        }
                                    >
                                        <p
                                            className={`text-lg font-bold ${npfColor(npf_ratio)}`}
                                        >
                                            {npf_ratio?.toFixed(2) ?? '0.00'}%
                                        </p>
                                    </Deferred>
                                </div>
                            </div>
                        </CardContent>
                    </Card>

                    {/* Overdue Alert */}
                    {can('financing.view') && (
                        <Card>
                            <CardHeader>
                                <CardTitle className="flex items-center gap-2">
                                    <AlertTriangle className="h-4 w-4 text-destructive" />
                                    Pembiayaan Bermasalah
                                </CardTitle>
                            </CardHeader>
                            <CardContent className="flex flex-col gap-4">
                                <div className="rounded-lg border border-destructive/20 bg-destructive/5 p-4">
                                    <p className="text-sm text-muted-foreground">
                                        Pembiayaan overdue
                                    </p>
                                    <p className="text-2xl font-bold text-destructive">
                                        {overdue_count}
                                    </p>
                                </div>
                                <Button
                                    variant="outline"
                                    className="w-full"
                                    size="sm"
                                    asChild
                                >
                                    <Link href={dailyCollection.index().url}>
                                        Lihat semua overdue
                                    </Link>
                                </Button>
                            </CardContent>
                        </Card>
                    )}

                    {/* Pending Approvals */}
                    <Card className="lg:col-span-1">
                        <CardHeader>
                            <CardTitle>Persetujuan Tertunda</CardTitle>
                            <CardDescription>
                                Pengajuan pembiayaan menunggu review
                            </CardDescription>
                        </CardHeader>
                        <CardContent>
                            <Deferred
                                data="pending_approvals"
                                fallback={
                                    <div className="space-y-4">
                                        {[...Array(3)].map((_, i) => (
                                            <div
                                                key={i}
                                                className="flex flex-col gap-2"
                                            >
                                                <div className="h-4 w-full animate-pulse rounded bg-muted" />
                                                <div className="h-3 w-2/3 animate-pulse rounded bg-muted" />
                                            </div>
                                        ))}
                                    </div>
                                }
                            >
                                <div className="space-y-4">
                                    {pending_approvals?.length === 0 ? (
                                        <p className="py-8 text-center text-sm text-muted-foreground">
                                            Tidak ada pengajuan tertunda.
                                        </p>
                                    ) : (
                                        pending_approvals?.map((item) => (
                                            <div
                                                key={item.id}
                                                className="flex flex-col gap-1 border-b pb-3 last:border-0 last:pb-0"
                                            >
                                                <div className="flex items-center justify-between">
                                                    <span className="text-sm font-medium">
                                                        {item.account_number}
                                                    </span>
                                                    <span className="text-sm font-bold">
                                                        {formatIDR(
                                                            item.principal_amount,
                                                        )}
                                                    </span>
                                                </div>
                                                <div className="flex items-center justify-between text-xs text-muted-foreground">
                                                    <span>
                                                        Tgl:{' '}
                                                        {item.created_at
                                                            ? new Date(
                                                                  item.created_at,
                                                              ).toLocaleDateString(
                                                                  'id-ID',
                                                              )
                                                            : '-'}
                                                    </span>
                                                    <Link
                                                        href={
                                                            financing.show(
                                                                item.id,
                                                            ).url
                                                        }
                                                        className="text-primary hover:underline"
                                                    >
                                                        Review
                                                    </Link>
                                                </div>
                                            </div>
                                        ))
                                    )}
                                </div>
                            </Deferred>
                        </CardContent>
                    </Card>

                    {/* Recent Activities */}
                    <Card className="lg:col-span-2">
                        <CardHeader>
                            <CardTitle>Aktivitas Terakhir</CardTitle>
                            <CardDescription>
                                Log aktivitas sistem terbaru
                            </CardDescription>
                        </CardHeader>
                        <CardContent>
                            <Deferred
                                data="recent_activities"
                                fallback={
                                    <div className="space-y-4">
                                        {[...Array(5)].map((_, i) => (
                                            <div key={i} className="flex gap-3">
                                                <div className="h-10 w-10 animate-pulse rounded-full bg-muted" />
                                                <div className="flex-1 space-y-2">
                                                    <div className="h-4 w-1/4 animate-pulse rounded bg-muted" />
                                                    <div className="h-3 w-3/4 animate-pulse rounded bg-muted" />
                                                </div>
                                            </div>
                                        ))}
                                    </div>
                                }
                            >
                                <div className="space-y-4">
                                    {recent_activities?.length === 0 ? (
                                        <p className="py-8 text-center text-sm text-muted-foreground">
                                            Belum ada aktivitas.
                                        </p>
                                    ) : (
                                        recent_activities?.map((log) => (
                                            <div
                                                key={log.id}
                                                className="flex items-start gap-3 border-b pb-3 last:border-0 last:pb-0"
                                            >
                                                <div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary">
                                                    <FileText className="h-4 w-4" />
                                                </div>
                                                <div className="flex flex-col gap-1">
                                                    <div className="flex items-center gap-2">
                                                        <span className="text-sm font-medium">
                                                            {log.action}
                                                        </span>
                                                        <span className="text-xs text-muted-foreground">
                                                            {log.created_at
                                                                ? new Date(
                                                                      log.created_at,
                                                                  ).toLocaleString(
                                                                      'id-ID',
                                                                  )
                                                                : '-'}
                                                        </span>
                                                    </div>
                                                    <p className="line-clamp-1 text-xs text-muted-foreground">
                                                        {log.entity_type} #
                                                        {log.entity_id} ·{' '}
                                                        {log.ip_address}
                                                    </p>
                                                </div>
                                            </div>
                                        ))
                                    )}
                                </div>
                            </Deferred>
                        </CardContent>
                    </Card>
                </div>
            </div>
        </AppLayout>
    );
}
