import { Head, Link, usePage } from '@inertiajs/react';
import { ArrowLeftRight, Banknote, Landmark, Plus, Wallet } from 'lucide-react';
import { useMemo } from 'react';
import { show as sarafAccount } from '@/actions/App/Http/Controllers/SarafAccountController';
import { index as sarafsIndex } from '@/actions/App/Http/Controllers/SarafController';
import { create as sarafPaymentsCreate } from '@/actions/App/Http/Controllers/SarafPaymentController';
import { CurrencyExchangesDataTable } from '@/components/sarafi/currency-exchanges-data-table';
import { SarafPaymentsDataTable } from '@/components/sarafi/saraf-payments-data-table';
import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { useLanguage } from '@/contexts/language-context';
import { formatMoneyAmountOrDash } from '@/lib/dates';
import { cn } from '@/lib/utils';
import AppLayout from '@/layouts/app-layout';
import { dashboard } from '@/routes';

function SummaryStat({ label, value, highlight = false, warning = false }) {
    return (
        <div className="rounded-xl border border-border/80 bg-muted/15 p-4">
            <dt className="text-muted-foreground mb-2 text-sm">{label}</dt>
            <dd
                className={cn(
                    'text-lg font-semibold tabular-nums',
                    highlight && 'text-primary',
                    warning && 'text-amber-700 dark:text-amber-400',
                )}
            >
                {value}
            </dd>
        </div>
    );
}

export default function SarafAccount() {
    const { t, locale } = useLanguage();
    const p = t.sarafAccountPage;
    const paymentLabels = t.sarafPaymentPage;
    const exchangeLabels = t.currencyExchangePage;
    const page = usePage();
    const auth = page.props.auth ?? {};
    const canCreatePayment = auth.canCreateSarafs === true;
    const { saraf, summary, exchanges = [], payments = [] } = page.props;

    const remainUsd = Number(summary?.remain_dollar_on_saraf ?? 0);

    const breadcrumbs = useMemo(
        () => [
            { title: t.dashboard.breadcrumb, href: dashboard() },
            { title: t.nav.sarafi, href: '#' },
            { title: t.sarafsPage.breadcrumb, href: sarafsIndex() },
            {
                title: saraf?.name ?? '',
                href: sarafAccount.url(saraf?.id),
            },
            {
                title: p.breadcrumb,
                href: sarafAccount.url(saraf?.id),
            },
        ],
        [
            t.dashboard.breadcrumb,
            t.nav.sarafi,
            t.sarafsPage.breadcrumb,
            saraf?.id,
            saraf?.name,
            p.breadcrumb,
        ],
    );

    const tableLabels = useMemo(
        () => ({
            ...exchangeLabels,
            searchPlaceholder: p.searchPlaceholder,
            empty: p.emptyTransactions,
        }),
        [exchangeLabels, p],
    );

    const paymentTableLabels = useMemo(() => ({ ...paymentLabels }), [paymentLabels]);

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={`${p.headTitle} — ${saraf?.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={sarafsIndex()} prefetch>
                            {p.backToSarafs}
                        </Link>
                    </Button>
                    {canCreatePayment && remainUsd > 0.001 ? (
                        <div className="flex flex-wrap gap-2">
                            <Button variant="outline" asChild>
                                <Link
                                    href={sarafPaymentsCreate.url(saraf.id, {
                                        query: { type: 'exchange' },
                                    })}
                                    prefetch
                                >
                                    <Plus className="size-4" />
                                    {p.payByExchange}
                                </Link>
                            </Button>
                            <Button asChild>
                                <Link
                                    href={sarafPaymentsCreate.url(saraf.id, {
                                        query: { type: 'general' },
                                    })}
                                    prefetch
                                >
                                    <Banknote className="size-4" />
                                    {p.payGeneral}
                                </Link>
                            </Button>
                        </div>
                    ) : null}
                </div>

                <Card>
                    <CardHeader className="bg-muted/45 dark:bg-muted/20 border-b border-border">
                        <CardTitle className="flex items-center gap-2 text-xl">
                            <Landmark className="size-5" />
                            {saraf?.name}
                        </CardTitle>
                        <CardDescription>{p.accountSubtitle}</CardDescription>
                    </CardHeader>
                    <CardContent className="space-y-6 pt-6">
                        <div className="grid gap-4 sm:grid-cols-2 xl:grid-cols-5">
                            <SummaryStat
                                label={p.totalExchanges}
                                value={String(summary?.exchange_count ?? 0)}
                            />
                            <SummaryStat
                                label={p.totalAfnExchanged}
                                value={`${formatMoneyAmountOrDash(summary?.total_afn, locale)} ${exchangeLabels.afnCurrencyLabel}`}
                            />
                            <SummaryStat
                                label={p.totalUsdExchanged}
                                value={`${formatMoneyAmountOrDash(summary?.total_dollar, locale)} ${exchangeLabels.usdCurrencyLabel}`}
                            />
                            <SummaryStat
                                label={p.totalUsdReceived}
                                value={`${formatMoneyAmountOrDash(summary?.receive_dollar, locale)} ${exchangeLabels.usdCurrencyLabel}`}
                                highlight
                            />
                            <SummaryStat
                                label={p.totalRemainUsd}
                                value={`${formatMoneyAmountOrDash(summary?.remain_dollar_on_saraf, locale)} ${exchangeLabels.usdCurrencyLabel}`}
                                warning={remainUsd > 0.001}
                            />
                        </div>

                        {remainUsd > 0.001 ? (
                            <div className="rounded-xl border border-amber-500/30 bg-amber-500/10 px-4 py-3 text-sm">
                                <div className="flex items-start gap-3">
                                    <Wallet className="mt-0.5 size-4 shrink-0 text-amber-700 dark:text-amber-300" />
                                    <p className="text-amber-900 dark:text-amber-100">
                                        {p.remainUsdHint.replace(
                                            '{amount}',
                                            formatMoneyAmountOrDash(
                                                summary?.remain_dollar_on_saraf,
                                                locale,
                                            ),
                                        )}
                                    </p>
                                </div>
                            </div>
                        ) : null}
                    </CardContent>
                </Card>

                <Card>
                    <CardHeader>
                        <CardTitle className="flex items-center gap-2">
                            <Banknote className="size-5" />
                            {p.paymentsSection}
                        </CardTitle>
                        <CardDescription>{p.paymentsSectionHint}</CardDescription>
                    </CardHeader>
                    <CardContent>
                        <SarafPaymentsDataTable
                            payments={payments}
                            labels={paymentTableLabels}
                            locale={locale}
                        />
                    </CardContent>
                </Card>

                <Card>
                    <CardHeader>
                        <CardTitle className="flex items-center gap-2">
                            <ArrowLeftRight className="size-5" />
                            {p.transactionsSection}
                        </CardTitle>
                        <CardDescription>{p.transactionsSectionHint}</CardDescription>
                    </CardHeader>
                    <CardContent>
                        <CurrencyExchangesDataTable
                            exchanges={exchanges}
                            labels={tableLabels}
                            locale={locale}
                            hideSarafColumn
                        />
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
