import { Head, Link, router, usePage } from '@inertiajs/react';
import { Pencil, XCircle } from 'lucide-react';
import { useMemo, useState } from 'react';
import { toast } from 'sonner';
import {
    cancelItem as cancelCustomerOrderItem,
    editItem as customerOrderItemEdit,
    index as customerOrdersIndex,
    deliverItem,
} from '@/actions/App/Http/Controllers/CustomerOrderController';
import { ConfirmActionDialog } from '@/components/confirm-action-dialog';
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 { formatAppDateOrDash, formatMoneyAmountOrDash } from '@/lib/dates';
import {
    customerOrderCanManage,
    customerOrderItemCanCancel,
    customerOrderItemCanEdit,
} from '@/lib/customer-order-permissions';
import { firstInertiaErrorMessage } from '@/lib/inertia-errors';
import { useLanguage } from '@/contexts/language-context';
import AppLayout from '@/layouts/app-layout';
import { dashboard } from '@/routes';

export default function CustomerOrdersShow() {
    const { t, locale } = useLanguage();
    const p = t.customerOrdersPage;
    const a = t.appActions;
    const auth = usePage().props.auth ?? {};
    const canManage = customerOrderCanManage(auth);
    const canDeliver = canManage;
    const { order } = usePage().props;
    const [cancelTarget, setCancelTarget] = useState(null);
    const [cancelOpen, setCancelOpen] = useState(false);
    const [cancelProcessing, setCancelProcessing] = useState(false);

    const breadcrumbs = useMemo(
        () => [
            { title: t.dashboard.breadcrumb, href: dashboard() },
            { title: t.nav.customers, href: '#' },
            { title: p.breadcrumb, href: customerOrdersIndex.url() },
            { title: String(order?.id ?? ''), href: '#' },
        ],
        [t.dashboard.breadcrumb, t.nav.customers, p.breadcrumb, order?.id],
    );

    function handleDeliver(itemId) {
        router.post(
            deliverItem.url(itemId),
            {},
            {
                preserveScroll: true,
                onError: (errors) =>
                    toast.error(firstInertiaErrorMessage(errors, a.requestFailed)),
            },
        );
    }

    function openCancelDialog(item) {
        setCancelTarget(item);
        setCancelOpen(true);
    }

    function commitCancelItem() {
        if (!cancelTarget) {
            return;
        }

        setCancelProcessing(true);
        router.post(
            cancelCustomerOrderItem.url(cancelTarget.id),
            {},
            {
                preserveScroll: true,
                onSuccess: () => {
                    setCancelOpen(false);
                    setCancelTarget(null);
                },
                onError: (errors) =>
                    toast.error(firstInertiaErrorMessage(errors, a.requestFailed)),
                onFinish: () => setCancelProcessing(false),
            },
        );
    }

    const orderIsCompleted = order?.status === 'completed';

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={p.showHeadTitle} />
            <div className="flex h-full flex-1 flex-col gap-6 overflow-x-auto p-4">
                <ConfirmActionDialog
                    open={cancelOpen}
                    onOpenChange={setCancelOpen}
                    title={p.confirmCancelItemTitle}
                    description={p.confirmCancelItemBody}
                    confirmLabel={p.cancelItem}
                    cancelLabel={a.cancel}
                    processing={cancelProcessing}
                    onConfirm={commitCancelItem}
                />
                <Card>
                    <CardHeader>
                        <div className="space-y-2">
                            <CardTitle>{p.showHeadTitle}</CardTitle>
                            <CardDescription>
                                {order?.order_number ?? `#${order?.id ?? ''}`} —{' '}
                                {order?.customer_name} —{' '}
                                {formatAppDateOrDash(order?.ordered_at, locale)} —{' '}
                                {p.statusLabels[order?.status]}
                            </CardDescription>
                        </div>
                    </CardHeader>
                    <CardContent className="space-y-4">
                        {order?.notes ? (
                            <p className="text-muted-foreground text-sm">{order.notes}</p>
                        ) : null}
                        <Table>
                            <TableHeader>
                                <TableRow>
                                    <TableHead>{p.colProduct}</TableHead>
                                    <TableHead>{p.colQuantity}</TableHead>
                                    <TableHead>{p.colFulfilled}</TableHead>
                                    <TableHead>{p.colStatus}</TableHead>
                                    <TableHead>{p.colAction}</TableHead>
                                </TableRow>
                            </TableHeader>
                            <TableBody>
                                {(order?.items ?? []).map((item) => (
                                    <TableRow key={item.id}>
                                        <TableCell>
                                            {item.product_name}
                                            {item.unit_name ? ` (${item.unit_name})` : ''}
                                        </TableCell>
                                        <TableCell className="tabular-nums">
                                            {formatMoneyAmountOrDash(item.quantity, locale)}
                                        </TableCell>
                                        <TableCell className="tabular-nums">
                                            {formatMoneyAmountOrDash(
                                                item.fulfilled_quantity,
                                                locale,
                                            )}
                                        </TableCell>
                                        <TableCell>
                                            {p.itemStatusLabels[item.status]}
                                        </TableCell>
                                        <TableCell>
                                            <div className="flex flex-wrap gap-2">
                                                {canManage &&
                                                !orderIsCompleted &&
                                                customerOrderItemCanEdit(item) ? (
                                                    <Button
                                                        variant="outline"
                                                        size="sm"
                                                        asChild
                                                    >
                                                        <Link
                                                            href={customerOrderItemEdit.url(
                                                                item.id,
                                                            )}
                                                            prefetch
                                                        >
                                                            <Pencil className="size-4" />
                                                            {p.editItem}
                                                        </Link>
                                                    </Button>
                                                ) : null}
                                                {canManage &&
                                                !orderIsCompleted &&
                                                customerOrderItemCanCancel(item) ? (
                                                    <Button
                                                        type="button"
                                                        variant="outline"
                                                        size="sm"
                                                        onClick={() => openCancelDialog(item)}
                                                    >
                                                        <XCircle className="size-4" />
                                                        {p.cancelItem}
                                                    </Button>
                                                ) : null}
                                                {canDeliver && item.status === 'ready' ? (
                                                    <Button
                                                        type="button"
                                                        size="sm"
                                                        variant="outline"
                                                        onClick={() => handleDeliver(item.id)}
                                                    >
                                                        {p.markDelivered}
                                                    </Button>
                                                ) : null}
                                            </div>
                                        </TableCell>
                                    </TableRow>
                                ))}
                            </TableBody>
                        </Table>
                        <Button variant="outline" asChild>
                            <Link href={customerOrdersIndex.url()} prefetch>
                                {p.backToOrders}
                            </Link>
                        </Button>
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
