import { Head, Link, router } from '@inertiajs/react';
import { Bell } from 'lucide-react';
import DashboardAnalyticsController from '@/actions/App/Http/Controllers/Admin/DashboardAnalyticsController';
import Heading from '@/components/heading';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import {
    Table,
    TableBody,
    TableCell,
    TableHead,
    TableHeader,
    TableRow,
} from '@/components/ui/table';
import { formatCurrency, formatDate } from '@/lib/utils';
import { dashboard } from '@/routes';
import { payments } from '@/routes/admin/dashboards';
import { show as showInvoice } from '@/routes/admin/invoices';
import {
    DashboardExportButtons,
    DashboardFiltersBar,
    type DashboardFilters,
    type FilterOptions,
} from './dashboard-filters';
import { KpiCard } from './dashboard-widgets';

function StatusBadge({ status, label }: { status: string; label: string }) {
    const variant =
        status === 'paid'
            ? 'default'
            : status === 'overdue'
              ? 'destructive'
              : 'secondary';

    return <Badge variant={variant}>{label}</Badge>;
}

export default function DashboardsPayments({
    overview,
    filters,
    filterOptions,
    can,
}: {
    overview: {
        kpis: {
            client_outstanding: string;
            client_overdue: string;
            client_overdue_count: number;
            supplier_pending: string;
            supplier_overdue: string;
            supplier_overdue_count: number;
            collected: string;
            paid_suppliers: string;
            pending_count: number;
        };
        received_payments: Array<Record<string, string | number | null | undefined>>;
        made_payments: Array<Record<string, string | number | null | undefined>>;
        pending_items: Array<Record<string, string | number | boolean | null | undefined>>;
        overdue_client_invoices: Array<Record<string, string | number | boolean | null | undefined>>;
        overdue_supplier_invoices: Array<Record<string, string | number | boolean | null | undefined>>;
    };
    filters: DashboardFilters;
    filterOptions: FilterOptions;
    can: { export: boolean };
}) {
    return (
        <>
            <Head title="Suivi de Paiement" />
            <div className="flex h-full flex-1 flex-col gap-6 p-4 md:p-6">
                <div className="flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between">
                    <Heading
                        title="Suivi de Paiement"
                        description="Paiements reçus/effectués, statuts et relances clients"
                    />
                    <DashboardExportButtons view="payments" filters={filters} canExport={can.export} />
                </div>

                <DashboardFiltersBar active="payments" filters={filters} filterOptions={filterOptions} />

                <div className="grid gap-4 sm:grid-cols-2 xl:grid-cols-4">
                    <KpiCard label="Encaissements période" value={overview.kpis.collected} tone="positive" />
                    <KpiCard label="Paiements fournisseurs" value={overview.kpis.paid_suppliers} hint="Flux période" />
                    <KpiCard label="Retards clients" value={overview.kpis.client_overdue} tone="negative" hint={`${overview.kpis.client_overdue_count} facture(s) à date`} />
                    <KpiCard label="Retards fournisseurs" value={overview.kpis.supplier_overdue} tone="negative" hint={`${overview.kpis.supplier_overdue_count} facture(s) à date`} />
                </div>

                <div className="grid gap-4 sm:grid-cols-2 xl:grid-cols-3">
                    <KpiCard label="Encours clients" value={overview.kpis.client_outstanding} tone="warning" hint="Stock à date" />
                    <KpiCard label="Dettes fournisseurs" value={overview.kpis.supplier_pending} tone="warning" hint="Stock à date" />
                    <KpiCard label="En attente (non échus)" value={overview.kpis.pending_count} format="number" hint="Hors retards, à date" />
                </div>

                <div className="grid gap-6 xl:grid-cols-2">
                    <Card>
                        <CardHeader>
                            <CardTitle>Paiements reçus</CardTitle>
                            <CardDescription>Encaissements clients sur la période</CardDescription>
                        </CardHeader>
                        <CardContent>
                            <PaymentTable rows={overview.received_payments} />
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader>
                            <CardTitle>Paiements effectués</CardTitle>
                            <CardDescription>Règlements fournisseurs sur la période</CardDescription>
                        </CardHeader>
                        <CardContent>
                            <PaymentTable rows={overview.made_payments} />
                        </CardContent>
                    </Card>
                </div>

                <Card>
                    <CardHeader>
                        <CardTitle>En attente de règlement</CardTitle>
                    </CardHeader>
                    <CardContent>
                        <PendingTable rows={overview.pending_items} />
                    </CardContent>
                </Card>

                <div className="grid gap-6 xl:grid-cols-2">
                    <Card>
                        <CardHeader>
                            <CardTitle>Factures clients en retard</CardTitle>
                            <CardDescription>Relance automatique par e-mail disponible</CardDescription>
                        </CardHeader>
                        <CardContent>
                            <OverdueClientTable rows={overview.overdue_client_invoices} />
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader>
                            <CardTitle>Factures fournisseurs en retard</CardTitle>
                        </CardHeader>
                        <CardContent>
                            <OverdueSupplierTable rows={overview.overdue_supplier_invoices} />
                        </CardContent>
                    </Card>
                </div>
            </div>
        </>
    );
}

function PaymentTable({ rows }: { rows: Array<Record<string, string | number | null | undefined>> }) {
    if (rows.length === 0) {
        return <p className="text-sm text-muted-foreground">Aucun paiement sur la période.</p>;
    }

    return (
        <Table>
            <TableHeader>
                <TableRow>
                    <TableHead>Date</TableHead>
                    <TableHead>Tiers</TableHead>
                    <TableHead>Document</TableHead>
                    <TableHead className="text-right">Montant</TableHead>
                    <TableHead>Statut</TableHead>
                </TableRow>
            </TableHeader>
            <TableBody>
                {rows.map((row) => (
                    <TableRow key={String(row.id)}>
                        <TableCell>{formatDate(String(row.paid_at ?? ''))}</TableCell>
                        <TableCell>{String(row.counterparty ?? '—')}</TableCell>
                        <TableCell>{String(row.document_code ?? '—')}</TableCell>
                        <TableCell className="text-right tabular-nums">{formatCurrency(String(row.amount ?? 0))}</TableCell>
                        <TableCell>
                            <StatusBadge status="paid" label={String(row.status_label ?? 'Payé')} />
                        </TableCell>
                    </TableRow>
                ))}
            </TableBody>
        </Table>
    );
}

function PendingTable({ rows }: { rows: Array<Record<string, string | number | boolean | null | undefined>> }) {
    if (rows.length === 0) {
        return <p className="text-sm text-muted-foreground">Aucune facture en attente.</p>;
    }

    return (
        <Table>
            <TableHeader>
                <TableRow>
                    <TableHead>Type</TableHead>
                    <TableHead>Document</TableHead>
                    <TableHead>Tiers</TableHead>
                    <TableHead>Échéance</TableHead>
                    <TableHead className="text-right">Montant</TableHead>
                    <TableHead>Statut</TableHead>
                </TableRow>
            </TableHeader>
            <TableBody>
                {rows.map((row) => (
                    <TableRow key={`${row.type}-${row.id}`}>
                        <TableCell>{row.type === 'client' ? 'Client' : 'Fournisseur'}</TableCell>
                        <TableCell>{String(row.code ?? '—')}</TableCell>
                        <TableCell>{String(row.counterparty ?? '—')}</TableCell>
                        <TableCell>{formatDate(String(row.due_date ?? ''))}</TableCell>
                        <TableCell className="text-right tabular-nums">
                            {formatCurrency(String(row.balance_due ?? row.amount ?? 0))}
                        </TableCell>
                        <TableCell>
                            <StatusBadge status="pending" label={String(row.status_label ?? 'En attente')} />
                        </TableCell>
                    </TableRow>
                ))}
            </TableBody>
        </Table>
    );
}

function OverdueClientTable({ rows }: { rows: Array<Record<string, string | number | boolean | null | undefined>> }) {
    if (rows.length === 0) {
        return <p className="text-sm text-muted-foreground">Aucun retard client.</p>;
    }

    return (
        <Table>
            <TableHeader>
                <TableRow>
                    <TableHead>Facture</TableHead>
                    <TableHead>Client</TableHead>
                    <TableHead>Échéance</TableHead>
                    <TableHead className="text-right">Solde</TableHead>
                    <TableHead />
                </TableRow>
            </TableHeader>
            <TableBody>
                {rows.map((row) => (
                    <TableRow key={String(row.id)}>
                        <TableCell>
                            <Link href={showInvoice.url(Number(row.id))} className="font-medium underline-offset-4 hover:underline">
                                {String(row.code)}
                            </Link>
                        </TableCell>
                        <TableCell>{String(row.counterparty ?? '—')}</TableCell>
                        <TableCell>{formatDate(String(row.due_date ?? ''))}</TableCell>
                        <TableCell className="text-right tabular-nums text-destructive">
                            {formatCurrency(String(row.balance_due ?? 0))}
                        </TableCell>
                        <TableCell className="text-right">
                            {row.can_remind ? (
                                <Button
                                    size="sm"
                                    variant="outline"
                                    onClick={() =>
                                        router.post(
                                            DashboardAnalyticsController.sendReminder.url(Number(row.id)),
                                            {},
                                            { preserveScroll: true },
                                        )
                                    }
                                >
                                    <Bell />
                                    Relancer
                                </Button>
                            ) : null}
                        </TableCell>
                    </TableRow>
                ))}
            </TableBody>
        </Table>
    );
}

function OverdueSupplierTable({ rows }: { rows: Array<Record<string, string | number | boolean | null | undefined>> }) {
    if (rows.length === 0) {
        return <p className="text-sm text-muted-foreground">Aucun retard fournisseur.</p>;
    }

    return (
        <Table>
            <TableHeader>
                <TableRow>
                    <TableHead>Facture</TableHead>
                    <TableHead>Fournisseur</TableHead>
                    <TableHead>Échéance</TableHead>
                    <TableHead className="text-right">Montant</TableHead>
                    <TableHead>Statut</TableHead>
                </TableRow>
            </TableHeader>
            <TableBody>
                {rows.map((row) => (
                    <TableRow key={String(row.id)}>
                        <TableCell>
                            <div className="font-medium">{String(row.code)}</div>
                            <div className="text-xs text-muted-foreground">{String(row.reference ?? '')}</div>
                        </TableCell>
                        <TableCell>{String(row.counterparty ?? '—')}</TableCell>
                        <TableCell>{formatDate(String(row.due_date ?? ''))}</TableCell>
                        <TableCell className="text-right tabular-nums text-destructive">
                            {formatCurrency(String(row.amount ?? 0))}
                        </TableCell>
                        <TableCell>
                            <StatusBadge status="overdue" label={String(row.status_label ?? 'En retard')} />
                        </TableCell>
                    </TableRow>
                ))}
            </TableBody>
        </Table>
    );
}

DashboardsPayments.layout = {
    breadcrumbs: [
        { title: 'Tableau de bord', href: dashboard() },
        { title: 'Suivi de Paiement', href: payments() },
    ],
};
