import { Head, Link, router, usePage } from '@inertiajs/react';
import { Banknote, FileText, HandCoins, Plus } from 'lucide-react';
import { useMemo } from 'react';
import { show as saleShow } from '@/actions/App/Http/Controllers/SaleController';
import { show as customerAccount } from '@/actions/App/Http/Controllers/CustomerAccountController';
import { index as customerLedgerIndex } from '@/actions/App/Http/Controllers/CustomerLedgerReportController';
import { create as paymentsCreate } from '@/actions/App/Http/Controllers/CustomerPaymentController';
import { index as customersIndex } from '@/actions/App/Http/Controllers/CustomerController';
import { CustomerLoanSummaryCard } from '@/components/customers/customer-loan-summary-card';
import { CustomerLoanStatusBadge } from '@/components/customers/customer-loan-status-badge';
import { CustomerPaymentsDataTable } from '@/components/customers/customer-payments-data-table';
import { CustomerPurchasesDataTable } from '@/components/customers/customer-purchases-data-table';
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 {
    formatExpenseDateNumericOrDash,
    formatMoneyAmountOrDash,
    formatPurchaseCurrencyLabel,
} from '@/lib/dates';
import AppLayout from '@/layouts/app-layout';
import { dashboard } from '@/routes';

function parseMoney(value) {
    const parsed = Number.parseFloat(String(value ?? '0').replace(/,/g, ''));

    return Number.isFinite(parsed) ? parsed : 0;
}

export default function CustomerAccount() {
    const { t, locale } = useLanguage();
    const p = t.customerAccountPage;
    const loanLabels = t.customerLoansPage;
    const salesLabels = t.salesPage;
    const ledgerLabels = t.customerLedgerReportPage;
    const page = usePage();
    const auth = page.props.auth ?? {};
    const canCreatePayment = auth.canCreateCustomerPayments === true;
    const canCreateLoan = auth.canCreateCustomerLoans === true;
    const canRepayLoan = auth.canRepayCustomerLoans === true;
    const {
        customer,
        summary,
        loanSummary,
        sales = [],
        payments = [],
        loans = [],
    } = page.props;

    const summaries = useMemo(() => (summary ? [summary] : []), [summary]);
    const loanOutstanding = parseMoney(loanSummary?.outstanding);

    const salesById = useMemo(
        () => Object.fromEntries(sales.map((sale) => [sale.id, sale])),
        [sales],
    );

    function openSaleById(saleId) {
        if (!saleId) {
            return;
        }
        router.visit(saleShow.url(saleId));
    }

    function openSale(sale) {
        if (sale?.is_old_debt) {
            return;
        }

        openSaleById(sale?.id);
    }

    const breadcrumbs = useMemo(
        () => [
            { title: t.dashboard.breadcrumb, href: dashboard() },
            { title: t.customersPage.breadcrumb, href: customersIndex() },
            {
                title: customer?.full_name ?? '',
                href: customerAccount.url(customer?.id),
            },
            {
                title: p.breadcrumb,
                href: customerAccount.url(customer?.id),
            },
        ],
        [
            t.dashboard.breadcrumb,
            t.customersPage.breadcrumb,
            customer?.id,
            customer?.full_name,
            p.breadcrumb,
        ],
    );

    const loansPageUrl = `/customers/${customer?.id}/loans`;

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={`${p.headTitle} — ${customer?.full_name ?? ''}`} />

            <div className="flex h-full flex-1 flex-col gap-6 overflow-x-auto p-4">
                <div className="flex flex-wrap items-center justify-between gap-3">
                    <Button variant="outline" size="sm" asChild>
                        <Link href={customersIndex()} prefetch>
                            {p.backToCustomers}
                        </Link>
                    </Button>
                    <div className="flex flex-wrap gap-2">
                        <Button variant="outline" asChild>
                            <Link
                                href={customerLedgerIndex.url({
                                    query: { customer_id: customer.id },
                                })}
                                prefetch
                            >
                                <FileText className="size-4" />
                                {ledgerLabels.viewLedgerReport}
                            </Link>
                        </Button>
                        {canCreateLoan ? (
                            <Button variant="outline" asChild>
                                <Link
                                    href={`/customers/loans/create?customer_id=${customer.id}`}
                                    prefetch
                                >
                                    <HandCoins className="size-4" />
                                    {p.recordLoan}
                                </Link>
                            </Button>
                        ) : null}
                        {canRepayLoan && loanOutstanding > 0.001 ? (
                            <Button asChild>
                                <Link
                                    href={`/customers/${customer.id}/loan-repayments/create`}
                                    prefetch
                                >
                                    <Banknote className="size-4" />
                                    {p.repayAllLoans}
                                </Link>
                            </Button>
                        ) : null}
                        {canCreatePayment ? (
                            <>
                                <Button variant="outline" asChild>
                                    <Link
                                        href={paymentsCreate.url(customer.id, {
                                            query: { type: 'sale' },
                                        })}
                                        prefetch
                                    >
                                        <Plus className="size-4" />
                                        {p.payByBill}
                                    </Link>
                                </Button>
                                <Button asChild>
                                    <Link
                                        href={paymentsCreate.url(customer.id, {
                                            query: { type: 'overall' },
                                        })}
                                        prefetch
                                    >
                                        <Banknote className="size-4" />
                                        {p.overallPayment}
                                    </Link>
                                </Button>
                            </>
                        ) : null}
                    </div>
                </div>

                <Card>
                    <CardHeader>
                        <CardTitle>{customer?.full_name}</CardTitle>
                        <CardDescription>{p.accountSubtitle}</CardDescription>
                    </CardHeader>
                    <CardContent>
                        {summaries.length > 0 || loanSummary ? (
                            <div className="space-y-4">
                                <div className="grid gap-4 md:grid-cols-2">
                                    {summaries.map((row) => (
                                        <div key={row.currency} className="rounded-lg border p-4">
                                            <p className="text-muted-foreground mb-3 text-sm font-medium">
                                                {p.billsSection} —{' '}
                                                {formatPurchaseCurrencyLabel(row.currency, locale)}
                                            </p>
                                            <dl className="grid grid-cols-3 gap-3 text-sm">
                                                <div>
                                                    <dt className="text-muted-foreground">
                                                        {p.totalBilled}
                                                    </dt>
                                                    <dd className="font-semibold tabular-nums">
                                                        {formatMoneyAmountOrDash(
                                                            row.total_billed,
                                                            locale,
                                                        )}
                                                    </dd>
                                                </div>
                                                <div>
                                                    <dt className="text-muted-foreground">
                                                        {p.totalPaid}
                                                    </dt>
                                                    <dd className="font-semibold tabular-nums">
                                                        {formatMoneyAmountOrDash(
                                                            row.total_paid,
                                                            locale,
                                                        )}
                                                    </dd>
                                                </div>
                                                <div>
                                                    <dt className="text-muted-foreground">
                                                        {p.purchaseBalance}
                                                    </dt>
                                                    <dd className="font-semibold tabular-nums text-amber-700 dark:text-amber-400">
                                                        {formatMoneyAmountOrDash(
                                                            row.purchase_outstanding ??
                                                                row.outstanding,
                                                            locale,
                                                        )}
                                                    </dd>
                                                </div>
                                            </dl>
                                        </div>
                                    ))}
                                    {loanSummary ? (
                                        <div className="rounded-lg border p-4">
                                            <div className="mb-3 flex flex-wrap items-center justify-between gap-2">
                                                <p className="text-muted-foreground text-sm font-medium">
                                                    {p.loansSection}
                                                </p>
                                                <Button
                                                    variant="link"
                                                    size="sm"
                                                    className="h-auto p-0"
                                                    asChild
                                                >
                                                    <Link href={loansPageUrl} prefetch>
                                                        {p.viewCustomerLoans}
                                                    </Link>
                                                </Button>
                                            </div>
                                            <CustomerLoanSummaryCard
                                                loanSummary={loanSummary}
                                                labels={{
                                                    totalLoaned: p.totalLoaned,
                                                    totalLoanRepaid: p.totalLoanRepaid,
                                                    loanOutstanding: p.loanOutstanding,
                                                    currencyLabel: loanLabels.currencyLabel,
                                                }}
                                                locale={locale}
                                            />
                                        </div>
                                    ) : null}
                                </div>
                                {summaries.map((row) => {
                                    const overall = Number(
                                        row.outstanding ??
                                            Number(row.purchase_outstanding ?? 0) +
                                                Number(loanSummary?.outstanding ?? 0),
                                    );

                                    return (
                                        <div
                                            key={`overall-${row.currency}`}
                                            className="rounded-lg border border-amber-200 bg-amber-50/50 p-4 dark:border-amber-900/40 dark:bg-amber-950/20"
                                        >
                                            <dl className="grid gap-3 text-sm sm:grid-cols-3">
                                                <div>
                                                    <dt className="text-muted-foreground">
                                                        {p.purchaseBalance}
                                                    </dt>
                                                    <dd className="font-semibold tabular-nums">
                                                        {formatMoneyAmountOrDash(
                                                            row.purchase_outstanding ?? 0,
                                                            locale,
                                                        )}
                                                    </dd>
                                                </div>
                                                <div>
                                                    <dt className="text-muted-foreground">
                                                        {p.loanBalance}
                                                    </dt>
                                                    <dd className="font-semibold tabular-nums">
                                                        {formatMoneyAmountOrDash(
                                                            row.loan_outstanding ??
                                                                loanSummary?.outstanding ??
                                                                0,
                                                            locale,
                                                        )}
                                                    </dd>
                                                </div>
                                                <div>
                                                    <dt className="text-muted-foreground">
                                                        {p.overallBalance}
                                                    </dt>
                                                    <dd className="font-semibold tabular-nums text-amber-700 dark:text-amber-400">
                                                        {formatMoneyAmountOrDash(overall, locale)}
                                                    </dd>
                                                </div>
                                            </dl>
                                        </div>
                                    );
                                })}
                            </div>
                        ) : (
                            <p className="text-muted-foreground text-sm">{p.noActivity}</p>
                        )}
                    </CardContent>
                </Card>

                <Card>
                    <CardHeader className="flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between">
                        <div>
                            <CardTitle>{p.loansSection}</CardTitle>
                            <CardDescription>{p.loansSectionHint}</CardDescription>
                        </div>
                        <Button variant="outline" size="sm" asChild>
                            <Link href={loansPageUrl} prefetch>
                                {p.viewCustomerLoans}
                            </Link>
                        </Button>
                        {canRepayLoan && loanOutstanding > 0.001 ? (
                            <Button size="sm" asChild>
                                <Link
                                    href={`/customers/${customer.id}/loan-repayments/create`}
                                    prefetch
                                >
                                    {p.repayAllLoans}
                                </Link>
                            </Button>
                        ) : null}
                    </CardHeader>
                    <CardContent>
                        <div className="rounded-md border">
                            <Table>
                                <TableHeader>
                                    <TableRow>
                                        <TableHead>{loanLabels.colLoanNumber}</TableHead>
                                        <TableHead>{loanLabels.colDate}</TableHead>
                                        <TableHead className="text-end">{loanLabels.colAmount}</TableHead>
                                        <TableHead className="text-end">{loanLabels.colOutstanding}</TableHead>
                                        <TableHead>{loanLabels.colStatus}</TableHead>
                                    </TableRow>
                                </TableHeader>
                                <TableBody>
                                    {loans.length ? (
                                        loans.map((loan) => (
                                            <TableRow
                                                key={loan.id}
                                                className="cursor-pointer"
                                                onClick={() =>
                                                    router.visit(`/customers/loans/${loan.id}`)
                                                }
                                            >
                                                <TableCell className="font-medium">
                                                    {loan.loan_number}
                                                </TableCell>
                                                <TableCell>
                                                    {formatExpenseDateNumericOrDash(loan.loan_date)}
                                                </TableCell>
                                                <TableCell className="text-end tabular-nums">
                                                    {loan.amount_afn} {loanLabels.currencyLabel}
                                                </TableCell>
                                                <TableCell className="text-end tabular-nums font-medium text-amber-700 dark:text-amber-400">
                                                    {loan.due_amount_afn} {loanLabels.currencyLabel}
                                                </TableCell>
                                                <TableCell>
                                                    <CustomerLoanStatusBadge
                                                        status={loan.payment_status}
                                                        labels={loanLabels}
                                                    />
                                                </TableCell>
                                            </TableRow>
                                        ))
                                    ) : (
                                        <TableRow>
                                            <TableCell
                                                colSpan={5}
                                                className="h-20 text-center text-muted-foreground"
                                            >
                                                {p.noLoans}
                                            </TableCell>
                                        </TableRow>
                                    )}
                                </TableBody>
                            </Table>
                        </div>
                    </CardContent>
                </Card>

                <Card>
                    <CardHeader>
                        <CardTitle>{p.billsSection}</CardTitle>
                        <CardDescription>{p.billsSectionHint}</CardDescription>
                    </CardHeader>
                    <CardContent>
                        <CustomerPurchasesDataTable
                            purchases={sales}
                            labels={p}
                            statusLabels={salesLabels}
                            locale={locale}
                            showCurrencyColumn
                            onOpenSale={openSale}
                            searchInputId="customer-account-purchases-search"
                            pageSizeInputId="customer-account-purchases-page-size"
                        />
                    </CardContent>
                </Card>

                <Card>
                    <CardHeader>
                        <CardTitle>{p.paymentsSection}</CardTitle>
                        <CardDescription>{p.paymentsSectionHint}</CardDescription>
                    </CardHeader>
                    <CardContent>
                        <CustomerPaymentsDataTable
                            payments={payments}
                            labels={p}
                            locale={locale}
                            showPaymentTypeColumn
                            onOpenSaleById={(saleId) =>
                                openSaleById(salesById[saleId]?.id ?? saleId)
                            }
                            searchInputId="customer-account-payments-search"
                            pageSizeInputId="customer-account-payments-page-size"
                        />
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
