import { Head, Link } from '@inertiajs/react';
import { ArrowLeft, Package } from 'lucide-react';
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 { useCan } from '@/hooks/use-can';
import { formatDate } from '@/lib/utils';
import { dashboard } from '@/routes';
import { show as purchaseOrderShow } from '@/routes/admin/purchase-orders';
import { index as receiptsIndex } from '@/routes/admin/warehouses/receipts';

type ReceiptLine = {
    id: number;
    product: { id: number; code: string; name: string } | null;
    quantity: number;
};

type Receipt = {
    id: number;
    code: string;
    received_at: string | null;
    notes: string | null;
    created_at: string | null;
    warehouse: { id: number; code: string; name: string };
    purchase_order: { id: number; code: string } | null;
    creator: { id: number; name: string } | null;
    lines: ReceiptLine[];
    lines_quantity: number;
};

export default function WarehouseReceiptShow({
    receipt,
}: {
    receipt: Receipt;
}) {
    const canViewPurchaseOrders = useCan('purchase-orders.view');

    return (
        <>
            <Head title={receipt.code} />

            <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-start sm:justify-between">
                    <div className="space-y-2">
                        <div className="flex flex-wrap items-center gap-2">
                            <h1 className="font-mono text-xl font-semibold tracking-tight">
                                {receipt.code}
                            </h1>
                            {receipt.purchase_order ? (
                                <Badge variant="secondary">Commande</Badge>
                            ) : (
                                <Badge variant="outline">Manuelle</Badge>
                            )}
                        </div>
                        <p className="text-muted-foreground text-sm">
                            {formatDate(receipt.received_at)}
                            <span className="mx-1.5">·</span>
                            {receipt.warehouse.name}
                        </p>
                    </div>
                    <Button variant="outline" asChild>
                        <Link href={receiptsIndex(receipt.warehouse.id)}>
                            <ArrowLeft />
                            Retour
                        </Link>
                    </Button>
                </div>

                <div className="grid gap-4 sm:grid-cols-3">
                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Produits</CardDescription>
                            <CardTitle className="text-2xl tabular-nums">
                                {receipt.lines.length}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Unités reçues</CardDescription>
                            <CardTitle className="text-2xl tabular-nums">
                                {receipt.lines_quantity}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Créé par</CardDescription>
                            <CardTitle className="truncate text-lg font-medium">
                                {receipt.creator?.name ?? '—'}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                </div>

                <div className="grid gap-6 lg:grid-cols-3">
                    <Card>
                        <CardHeader>
                            <CardTitle>Informations</CardTitle>
                            <CardDescription>
                                Détails de la réception.
                            </CardDescription>
                        </CardHeader>
                        <CardContent>
                            <dl className="space-y-4 text-sm">
                                <div className="flex items-start justify-between gap-4">
                                    <dt className="text-muted-foreground">
                                        Entrepôt
                                    </dt>
                                    <dd className="text-right">
                                        {receipt.warehouse.code} —{' '}
                                        {receipt.warehouse.name}
                                    </dd>
                                </div>
                                <div className="flex items-start justify-between gap-4">
                                    <dt className="text-muted-foreground">
                                        Date de réception
                                    </dt>
                                    <dd>
                                        {formatDate(receipt.received_at)}
                                    </dd>
                                </div>
                                <div className="flex items-start justify-between gap-4">
                                    <dt className="text-muted-foreground">
                                        Origine
                                    </dt>
                                    <dd className="text-right">
                                        {receipt.purchase_order ? (
                                            canViewPurchaseOrders ? (
                                                <Link
                                                    href={purchaseOrderShow(
                                                        receipt.purchase_order
                                                            .id,
                                                    )}
                                                    className="font-medium underline-offset-4 hover:underline"
                                                >
                                                    {
                                                        receipt.purchase_order
                                                            .code
                                                    }
                                                </Link>
                                            ) : (
                                                receipt.purchase_order.code
                                            )
                                        ) : (
                                            'Manuelle'
                                        )}
                                    </dd>
                                </div>
                                <div className="flex items-start justify-between gap-4">
                                    <dt className="text-muted-foreground">
                                        Enregistré le
                                    </dt>
                                    <dd>
                                        {formatDate(receipt.created_at)}
                                    </dd>
                                </div>
                                {receipt.notes ? (
                                    <div className="space-y-1 border-t pt-4">
                                        <dt className="text-muted-foreground">
                                            Notes
                                        </dt>
                                        <dd className="whitespace-pre-line">
                                            {receipt.notes}
                                        </dd>
                                    </div>
                                ) : null}
                            </dl>
                        </CardContent>
                    </Card>

                    <Card className="lg:col-span-2">
                        <CardHeader className="flex-row items-start justify-between space-y-0">
                            <div className="space-y-1.5">
                                <CardTitle>Produits reçus</CardTitle>
                                <CardDescription>
                                    Lignes de cette entrée de stock.
                                </CardDescription>
                            </div>
                            <Package className="text-muted-foreground size-4" />
                        </CardHeader>
                        <CardContent>
                            <Table>
                                <TableHeader>
                                    <TableRow>
                                        <TableHead>Produit</TableHead>
                                        <TableHead>Code</TableHead>
                                        <TableHead className="text-right">
                                            Quantité
                                        </TableHead>
                                    </TableRow>
                                </TableHeader>
                                <TableBody>
                                    {receipt.lines.map((line) => (
                                        <TableRow key={line.id}>
                                            <TableCell className="font-medium">
                                                {line.product?.name ?? '—'}
                                            </TableCell>
                                            <TableCell className="text-muted-foreground font-mono text-sm">
                                                {line.product?.code ?? '—'}
                                            </TableCell>
                                            <TableCell className="text-right font-medium tabular-nums">
                                                {line.quantity}
                                            </TableCell>
                                        </TableRow>
                                    ))}
                                </TableBody>
                            </Table>
                        </CardContent>
                    </Card>
                </div>
            </div>
        </>
    );
}

WarehouseReceiptShow.layout = {
    breadcrumbs: [
        { title: 'Tableau de bord', href: dashboard() },
        { title: 'Réceptions', href: '#' },
        { title: 'Détail', href: '#' },
    ],
};
