import type { ReactNode } from 'react';
import { Head, Link } from '@inertiajs/react';
import { AlertTriangle, Package, ShoppingCart, Truck } from 'lucide-react';
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 { index } from '@/routes/admin/accounting-procurement';
import {
    create as createPurchaseOrder,
    show as showPurchaseOrder,
} from '@/routes/admin/purchase-orders';

type PurchaseOrderRow = {
    id: number;
    code: string;
    status: string;
    status_label: string;
    order_date: string | null;
    expected_delivery_date: string | null;
    invoice_due_date: string | null;
    total_amount: string | number;
    supplier: { id: number; code: string; name: string } | null;
};

type Overview = {
    low_stock_alerts: Array<{
        id: number;
        quantity: number;
        min_stock: number;
        product: { id: number; code: string; name: string };
        warehouse: { id: number; code: string; name: string };
    }>;
    pending_orders: PurchaseOrderRow[];
    overdue_deliveries: PurchaseOrderRow[];
    overdue_invoices: PurchaseOrderRow[];
    summary: {
        low_stock_count: number;
        pending_orders_count: number;
        overdue_deliveries_count: number;
        overdue_invoices_count: number;
    };
};

export default function AccountingProcurementIndex({
    overview,
    can,
}: {
    overview: Overview;
    can: { createPurchaseOrder: boolean };
}) {
    const { summary } = overview;

    return (
        <>
            <Head title="Approvisionnement comptable" />
            <div className="flex h-full flex-1 flex-col gap-6 p-4 md:p-6">
                <div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
                    <Heading
                        title="Approvisionnement"
                        description="Vue consolidée des besoins d'achat, commandes et alertes stock"
                    />
                    {can.createPurchaseOrder && (
                        <Button asChild>
                            <Link href={createPurchaseOrder.url()}>
                                <ShoppingCart />
                                Nouvelle commande
                            </Link>
                        </Button>
                    )}
                </div>

                <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Stock bas</CardDescription>
                            <CardTitle className="flex items-center gap-2">
                                <Package />
                                {summary.low_stock_count}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Commandes en cours</CardDescription>
                            <CardTitle className="flex items-center gap-2">
                                <Truck />
                                {summary.pending_orders_count}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Livraisons en retard</CardDescription>
                            <CardTitle className="flex items-center gap-2 text-destructive">
                                <AlertTriangle />
                                {summary.overdue_deliveries_count}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Factures en retard</CardDescription>
                            <CardTitle className="flex items-center gap-2 text-destructive">
                                <AlertTriangle />
                                {summary.overdue_invoices_count}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                </div>

                <ProcurementTable
                    title="Alertes stock — réapprovisionnement"
                    description="Produits sous le seuil minimum"
                    rows={overview.low_stock_alerts}
                    renderRow={(alert) => (
                        <TableRow key={alert.id}>
                            <TableCell>{alert.product.name}</TableCell>
                            <TableCell>{alert.warehouse.name}</TableCell>
                            <TableCell className="text-right tabular-nums">
                                {alert.quantity} / min {alert.min_stock}
                            </TableCell>
                        </TableRow>
                    )}
                    columns={['Produit', 'Entrepôt', 'Stock']}
                    empty="Aucune alerte stock."
                />

                <ProcurementTable
                    title="Commandes en attente"
                    rows={overview.pending_orders}
                    renderRow={(order) => (
                        <OrderRow key={order.id} order={order} />
                    )}
                    columns={['Commande', 'Fournisseur', 'Montant', 'Livraison prévue']}
                    empty="Aucune commande en cours."
                />

                <ProcurementTable
                    title="Livraisons en retard"
                    rows={overview.overdue_deliveries}
                    renderRow={(order) => (
                        <OrderRow key={order.id} order={order} highlight />
                    )}
                    columns={['Commande', 'Fournisseur', 'Montant', 'Livraison prévue']}
                    empty="Aucun retard de livraison."
                />

                <ProcurementTable
                    title="Factures fournisseurs en retard"
                    rows={overview.overdue_invoices}
                    renderRow={(order) => (
                        <OrderRow key={order.id} order={order} highlight dateField="invoice_due_date" />
                    )}
                    columns={['Commande', 'Fournisseur', 'Montant', 'Échéance facture']}
                    empty="Aucune facture en retard."
                />
            </div>
        </>
    );
}

function OrderRow({
    order,
    highlight = false,
    dateField = 'expected_delivery_date',
}: {
    order: PurchaseOrderRow;
    highlight?: boolean;
    dateField?: 'expected_delivery_date' | 'invoice_due_date';
}) {
    const date = order[dateField];

    return (
        <TableRow>
            <TableCell>
                <Link
                    href={showPurchaseOrder.url(order.id)}
                    className="font-mono text-sm hover:underline"
                >
                    {order.code}
                </Link>
                {highlight && (
                    <Badge variant="destructive" className="ml-2">
                        Retard
                    </Badge>
                )}
            </TableCell>
            <TableCell>{order.supplier?.name ?? '—'}</TableCell>
            <TableCell className="text-right tabular-nums">
                {formatCurrency(order.total_amount)}
            </TableCell>
            <TableCell>{date ? formatDate(date) : '—'}</TableCell>
        </TableRow>
    );
}

function ProcurementTable<T>({
    title,
    description,
    rows,
    columns,
    renderRow,
    empty,
}: {
    title: string;
    description?: string;
    rows: T[];
    columns: string[];
    renderRow: (row: T) => ReactNode;
    empty: string;
}) {
    return (
        <Card>
            <CardHeader>
                <CardTitle>{title}</CardTitle>
                {description && <CardDescription>{description}</CardDescription>}
            </CardHeader>
            <CardContent>
                {rows.length === 0 ? (
                    <p className="text-sm text-muted-foreground">{empty}</p>
                ) : (
                    <Table>
                        <TableHeader>
                            <TableRow>
                                {columns.map((col) => (
                                    <TableHead
                                        key={col}
                                        className={
                                            col === 'Montant' || col === 'Stock'
                                                ? 'text-right'
                                                : undefined
                                        }
                                    >
                                        {col}
                                    </TableHead>
                                ))}
                            </TableRow>
                        </TableHeader>
                        <TableBody>{rows.map(renderRow)}</TableBody>
                    </Table>
                )}
            </CardContent>
        </Card>
    );
}

AccountingProcurementIndex.layout = {
    breadcrumbs: [
        { title: 'Tableau de bord', href: dashboard() },
        { title: 'Approvisionnement', href: index() },
    ],
};
