import { Head, Link } from '@inertiajs/react';
import { ArrowLeft, FileText, Paperclip, Pencil, Printer } from 'lucide-react';
import { useMemo } from 'react';
import {
    index as expensesIndex,
    show as expenseDayShow,
} from '@/actions/App/Http/Controllers/ExpenseDayController';
import { ExpenseStatusBadge } from '@/components/expenses/expense-status-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 { useLanguage } from '@/contexts/language-context';
import {
    formatExpenseDateLongOrDash,
    formatExpenseDateTimeOrDash,
} from '@/lib/dates';
import {
    expenseCategoryLabel,
    expensePaymentLabel,
    expenseTransactionActionLabel,
} from '@/lib/expense-labels';
import { cn } from '@/lib/utils';
import AppLayout from '@/layouts/app-layout';
import { dashboard } from '@/routes';

function DetailItem({ label, value, emphasize = false, className }) {
    const isEmpty =
        value == null ||
        value === '' ||
        (typeof value === 'string' && value.trim() === '');

    return (
        <div className={cn('space-y-1', className)}>
            <dt className="text-muted-foreground text-xs font-medium tracking-wide uppercase">
                {label}
            </dt>
            <dd
                className={cn(
                    'text-sm font-medium break-words',
                    emphasize && 'text-base font-semibold tabular-nums',
                )}
            >
                {isEmpty ? '—' : value}
            </dd>
        </div>
    );
}

export default function ExpensesShow({ expense }) {
    const { t } = useLanguage();
    const p = t.expensesPage;

    const breadcrumbs = useMemo(
        () => [
            { title: t.dashboard.breadcrumb, href: dashboard() },
            { title: p.breadcrumb, href: expensesIndex() },
            {
                title: formatExpenseDateLongOrDash(expense.expense_date),
                href: expenseDayShow.url(expense.expense_day_id),
            },
            { title: expense.voucher_number, href: '#' },
        ],
        [t.dashboard.breadcrumb, p.breadcrumb, expense],
    );

    const categoryName = expenseCategoryLabel(
        expense.category_slug,
        expense.category_name,
        p,
    );
    const paymentLabel = expensePaymentLabel(expense.payment_method, p);
    const pageTitle = `${p.breadcrumb} · ${expense.voucher_number}`;

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={pageTitle} />

            <div className="mx-auto flex w-full max-w-5xl flex-1 flex-col gap-6 p-4">
                <div className="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between">
                    <div className="space-y-3">
                        <Button variant="outline" size="sm" asChild className="w-fit">
                            <Link href={expenseDayShow.url(expense.expense_day_id)} prefetch>
                                <ArrowLeft className="size-4" />
                                {p.back}
                            </Link>
                        </Button>

                        <div className="space-y-2">
                            <p className="text-muted-foreground text-sm font-medium">
                                {p.breadcrumb}
                            </p>
                            <div className="flex flex-wrap items-center gap-3">
                                <h1 className="font-mono text-2xl font-semibold tracking-tight">
                                    {expense.voucher_number}
                                </h1>
                                <ExpenseStatusBadge
                                    status={expense.status}
                                    label={expense.status_label}
                                />
                            </div>
                            <p className="text-muted-foreground text-sm">
                                {formatExpenseDateLongOrDash(expense.expense_date)}
                                {expense.created_by_name
                                    ? ` · ${p.colCreatedBy}: ${expense.created_by_name}`
                                    : null}
                            </p>
                        </div>
                    </div>

                    <div className="flex flex-wrap gap-2">
                        <Button variant="outline" asChild>
                            <a
                                href={`/expenses/${expense.id}/print?print=1`}
                                target="_blank"
                                rel="noreferrer"
                            >
                                <Printer className="size-4" />
                                {p.printExpense}
                            </a>
                        </Button>
                        {!expense.is_cancelled ? (
                            <Button asChild>
                                <Link href={`/expenses/${expense.id}/edit`}>
                                    <Pencil className="size-4" />
                                    {p.editExpense}
                                </Link>
                            </Button>
                        ) : null}
                    </div>
                </div>

                <Card>
                    <CardContent className="flex flex-col gap-4 pt-6 sm:flex-row sm:items-end sm:justify-between">
                        <div className="space-y-1">
                            <p className="text-muted-foreground text-sm">{p.colAmount}</p>
                            <p className="text-3xl font-semibold tracking-tight tabular-nums">
                                {expense.amount_afn}{' '}
                                <span className="text-muted-foreground text-lg font-medium">
                                    {p.currencyLabel}
                                </span>
                            </p>
                        </div>
                        <div className="text-muted-foreground grid gap-1 text-sm sm:text-end">
                            <p>
                                <span className="font-medium text-foreground">{categoryName}</span>
                            </p>
                            <p>{paymentLabel}</p>
                        </div>
                    </CardContent>
                </Card>

                <div className="grid gap-6 lg:grid-cols-2">
                    <Card>
                        <CardHeader className="pb-3">
                            <CardTitle className="text-base">{p.sectionDetails}</CardTitle>
                            <CardDescription>{p.expenseDetailTitle}</CardDescription>
                        </CardHeader>
                        <CardContent>
                            <dl className="grid gap-5 sm:grid-cols-2">
                                <DetailItem
                                    label={p.expenseDate}
                                    value={formatExpenseDateLongOrDash(expense.expense_date)}
                                />
                                <DetailItem label={p.category} value={categoryName} />
                                <DetailItem
                                    label={p.colVoucher}
                                    value={expense.voucher_number}
                                    className="sm:col-span-2"
                                />
                                <DetailItem
                                    label={p.colCreatedBy}
                                    value={expense.created_by_name}
                                />
                                <DetailItem
                                    label={p.status}
                                    value={
                                        <ExpenseStatusBadge
                                            status={expense.status}
                                            label={expense.status_label}
                                        />
                                    }
                                />
                            </dl>
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader className="pb-3">
                            <CardTitle className="text-base">{p.sectionPayment}</CardTitle>
                            <CardDescription>{p.sectionVendor}</CardDescription>
                        </CardHeader>
                        <CardContent className="space-y-5">
                            <dl className="grid gap-5 sm:grid-cols-2">
                                <DetailItem
                                    label={p.colAmount}
                                    value={`${expense.amount_afn} ${p.currencyLabel}`}
                                    emphasize
                                />
                                <DetailItem label={p.paymentMethod} value={paymentLabel} />
                                <DetailItem
                                    label={p.vendorPaidTo}
                                    value={expense.vendor_paid_to}
                                />
                                <DetailItem
                                    label={p.referenceNumber}
                                    value={expense.reference_number}
                                />
                            </dl>
                        </CardContent>
                    </Card>
                </div>

                <Card>
                    <CardHeader className="pb-3">
                        <CardTitle className="text-base">{p.description}</CardTitle>
                    </CardHeader>
                    <CardContent>
                        <p className="text-sm leading-relaxed whitespace-pre-wrap">
                            {expense.description?.trim() ? expense.description : '—'}
                        </p>
                    </CardContent>
                </Card>

                <Card>
                    <CardHeader className="pb-3">
                        <CardTitle className="flex items-center gap-2 text-base">
                            <Paperclip className="size-4" />
                            {p.attachments}
                        </CardTitle>
                        <CardDescription>
                            {expense.attachments?.length
                                ? String(expense.attachments.length)
                                : '—'}
                        </CardDescription>
                    </CardHeader>
                    <CardContent>
                        {expense.attachments?.length ? (
                            <ul className="divide-border divide-y rounded-lg border">
                                {expense.attachments.map((file) => (
                                    <li key={file.id}>
                                        <a
                                            href={file.file_url}
                                            target="_blank"
                                            rel="noreferrer"
                                            className="hover:bg-muted/40 flex items-center gap-3 px-4 py-3 text-sm transition-colors"
                                        >
                                            <FileText className="text-muted-foreground size-4 shrink-0" />
                                            <span className="text-primary min-w-0 flex-1 truncate font-medium underline-offset-4 hover:underline">
                                                {file.original_name}
                                            </span>
                                        </a>
                                    </li>
                                ))}
                            </ul>
                        ) : (
                            <p className="text-muted-foreground text-sm">—</p>
                        )}
                    </CardContent>
                </Card>

                <Card>
                    <CardHeader className="pb-3">
                        <CardTitle className="text-base">{p.transactionHistory}</CardTitle>
                    </CardHeader>
                    <CardContent>
                        {expense.transactions?.length ? (
                            <div className="overflow-x-auto rounded-lg border">
                                <Table>
                                    <TableHeader>
                                        <TableRow className="bg-muted/40 hover:bg-muted/40">
                                            <TableHead>{p.colAction}</TableHead>
                                            <TableHead className="text-end">
                                                {p.colAmount}
                                            </TableHead>
                                            <TableHead>{p.colPerformedBy}</TableHead>
                                            <TableHead>{p.colWhen}</TableHead>
                                        </TableRow>
                                    </TableHeader>
                                    <TableBody>
                                        {expense.transactions.map((row) => (
                                            <TableRow key={row.id}>
                                                <TableCell className="font-medium">
                                                    {expenseTransactionActionLabel(
                                                        row.action,
                                                        p,
                                                    )}
                                                </TableCell>
                                                <TableCell className="text-end tabular-nums">
                                                    {row.amount_afn} {p.currencyLabel}
                                                </TableCell>
                                                <TableCell>
                                                    {row.performed_by_name || '—'}
                                                </TableCell>
                                                <TableCell className="text-muted-foreground whitespace-nowrap">
                                                    {formatExpenseDateTimeOrDash(
                                                        row.created_at_display ??
                                                            row.created_at,
                                                    )}
                                                </TableCell>
                                            </TableRow>
                                        ))}
                                    </TableBody>
                                </Table>
                            </div>
                        ) : (
                            <p className="text-muted-foreground text-sm">—</p>
                        )}
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
