import { Head, Link } from '@inertiajs/react';
import {
    ArrowLeft,
    ClipboardList,
    Package,
    PackagePlus,
    Pencil,
} from 'lucide-react';
import { useMemo, useState } from '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 { dashboard } from '@/routes';
import { index } from '@/routes/admin/warehouses';
import {
    create as createReceipt,
    index as receiptsIndex,
} from '@/routes/admin/warehouses/receipts';
import {
    WarehouseFormModal,
    type UserOption,
    type WarehouseFormValues,
} from './warehouse-form-modal';

type Warehouse = {
    id: number;
    code: string;
    name: string;
    address: string | null;
    manager_id: number | null;
    manager: { id: number; name: string } | null;
    is_active: boolean;
};

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

export default function WarehousesShow({
    warehouse,
    stocks,
    users = [],
    canCreateReceipt = false,
}: {
    warehouse: Warehouse;
    stocks: StockRow[];
    users?: UserOption[];
    canCreateReceipt?: boolean;
}) {
    const canUpdate = useCan('warehouses.update');
    const canViewWarehouseList = useCan('warehouses.view');
    const canViewReceipts = canViewWarehouseList || canCreateReceipt;

    const [editOpen, setEditOpen] = useState(false);

    const formWarehouse: WarehouseFormValues = useMemo(
        () => ({
            id: warehouse.id,
            code: warehouse.code,
            name: warehouse.name,
            address: warehouse.address,
            manager_id: warehouse.manager_id,
            is_active: warehouse.is_active,
        }),
        [warehouse],
    );

    const totalUnits = stocks.reduce((sum, stock) => sum + stock.quantity, 0);

    return (
        <>
            <Head title={warehouse.name} />

            <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="text-xl font-semibold tracking-tight">
                                {warehouse.name}
                            </h1>
                            {warehouse.is_active ? (
                                <Badge variant="secondary">Actif</Badge>
                            ) : (
                                <Badge variant="outline">Inactif</Badge>
                            )}
                        </div>
                        <p className="text-muted-foreground text-sm">
                            <span className="font-mono">{warehouse.code}</span>
                            {warehouse.manager ? (
                                <>
                                    <span className="mx-1.5">·</span>
                                    Responsable {warehouse.manager.name}
                                </>
                            ) : null}
                        </p>
                    </div>
                    <div className="flex flex-wrap gap-2">
                        {canViewWarehouseList && (
                            <Button variant="outline" asChild>
                                <Link href={index()}>
                                    <ArrowLeft />
                                    Retour
                                </Link>
                            </Button>
                        )}
                        {canUpdate && (
                            <Button
                                variant="outline"
                                onClick={() => setEditOpen(true)}
                            >
                                <Pencil />
                                Modifier
                            </Button>
                        )}
                        {canViewReceipts && (
                            <Button variant="outline" asChild>
                                <Link href={receiptsIndex(warehouse.id)}>
                                    <ClipboardList />
                                    Réceptions
                                </Link>
                            </Button>
                        )}
                        {canCreateReceipt && (
                            <Button asChild>
                                <Link href={createReceipt(warehouse.id)}>
                                    <PackagePlus />
                                    Nouvelle réception
                                </Link>
                            </Button>
                        )}
                    </div>
                </div>

                <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Produits en stock</CardDescription>
                            <CardTitle className="text-2xl tabular-nums">
                                {stocks.length}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardDescription>Unités totales</CardDescription>
                            <CardTitle className="text-2xl tabular-nums">
                                {totalUnits}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                    <Card className="sm:col-span-2 lg:col-span-1">
                        <CardHeader className="pb-2">
                            <CardDescription>Responsable</CardDescription>
                            <CardTitle className="truncate text-lg font-medium">
                                {warehouse.manager?.name ?? 'Non assigné'}
                            </CardTitle>
                        </CardHeader>
                    </Card>
                </div>

                <div className="grid gap-6 lg:grid-cols-3">
                    <Card>
                        <CardHeader>
                            <CardTitle>Informations</CardTitle>
                            <CardDescription>
                                Identité et localisation de l&apos;entrepôt.
                            </CardDescription>
                        </CardHeader>
                        <CardContent>
                            <dl className="space-y-4 text-sm">
                                <div className="flex items-start justify-between gap-4">
                                    <dt className="text-muted-foreground">
                                        Code
                                    </dt>
                                    <dd className="font-mono font-medium">
                                        {warehouse.code}
                                    </dd>
                                </div>
                                <div className="flex items-start justify-between gap-4">
                                    <dt className="text-muted-foreground">
                                        Statut
                                    </dt>
                                    <dd>
                                        {warehouse.is_active
                                            ? 'Actif'
                                            : 'Inactif'}
                                    </dd>
                                </div>
                                <div className="flex items-start justify-between gap-4">
                                    <dt className="text-muted-foreground">
                                        Responsable
                                    </dt>
                                    <dd className="text-right">
                                        {warehouse.manager?.name ?? '—'}
                                    </dd>
                                </div>
                                <div className="space-y-1 border-t pt-4">
                                    <dt className="text-muted-foreground">
                                        Adresse
                                    </dt>
                                    <dd className="whitespace-pre-line">
                                        {warehouse.address || '—'}
                                    </dd>
                                </div>
                            </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>Stock actuel</CardTitle>
                                <CardDescription>
                                    Quantités disponibles dans cet entrepôt.
                                </CardDescription>
                            </div>
                            <Package className="text-muted-foreground size-4" />
                        </CardHeader>
                        <CardContent>
                            {stocks.length === 0 ? (
                                <div className="flex flex-col items-center justify-center gap-2 rounded-lg border border-dashed py-12 text-center">
                                    <Package className="text-muted-foreground size-8" />
                                    <p className="text-sm font-medium">
                                        Aucun stock
                                    </p>
                                    <p className="text-muted-foreground max-w-xs text-sm">
                                        Les produits apparaîtront ici après une
                                        réception.
                                    </p>
                                    {canCreateReceipt && (
                                        <Button
                                            className="mt-2"
                                            size="sm"
                                            asChild
                                        >
                                            <Link
                                                href={createReceipt(
                                                    warehouse.id,
                                                )}
                                            >
                                                <PackagePlus />
                                                Nouvelle réception
                                            </Link>
                                        </Button>
                                    )}
                                </div>
                            ) : (
                                <Table>
                                    <TableHeader>
                                        <TableRow>
                                            <TableHead>Produit</TableHead>
                                            <TableHead>Code</TableHead>
                                            <TableHead className="text-right">
                                                Quantité
                                            </TableHead>
                                        </TableRow>
                                    </TableHeader>
                                    <TableBody>
                                        {stocks.map((stock) => (
                                            <TableRow key={stock.product_id}>
                                                <TableCell className="font-medium">
                                                    {stock.product?.name ??
                                                        '—'}
                                                </TableCell>
                                                <TableCell className="text-muted-foreground font-mono text-sm">
                                                    {stock.product?.code ??
                                                        '—'}
                                                </TableCell>
                                                <TableCell className="text-right font-medium tabular-nums">
                                                    {stock.quantity}
                                                </TableCell>
                                            </TableRow>
                                        ))}
                                    </TableBody>
                                </Table>
                            )}
                        </CardContent>
                    </Card>
                </div>
            </div>

            {canUpdate && (
                <WarehouseFormModal
                    open={editOpen}
                    onOpenChange={setEditOpen}
                    warehouse={formWarehouse}
                    users={users}
                />
            )}
        </>
    );
}

WarehousesShow.layout = {
    breadcrumbs: [
        { title: 'Tableau de bord', href: dashboard() },
        { title: 'Entrepôts', href: index() },
        { title: 'Fiche', href: '#' },
    ],
};
