import { Head, Link, usePage } from '@inertiajs/react';
import { Plus } from 'lucide-react';
import { useMemo } from 'react';
import {
    create as customersCreate,
    edit as customersEdit,
    index as customersIndex,
    updateStatus as customersUpdateStatus,
} from '@/actions/App/Http/Controllers/CustomerController';
import { show as customerAccount } from '@/actions/App/Http/Controllers/CustomerAccountController';
import { index as customerOldDebts } from '@/actions/App/Http/Controllers/CustomerOldDebtController';
import { CustomersTable } from '@/components/customers/customers-table';
import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { useLanguage } from '@/contexts/language-context';
import AppLayout from '@/layouts/app-layout';
import { dashboard } from '@/routes';

export default function CustomersIndex() {
    const { t } = useLanguage();
    const p = t.customersPage;
    const a = t.appActions;
    const page = usePage();
    const auth = page.props.auth ?? {};
    const canCreate = auth.canCreateCustomers === true;
    const canViewAccount = auth.canViewCustomerPayments === true;
    const canViewLoans = auth.canViewCustomerLoans === true;
    const { customers, filters = { search: '', per_page: 10 } } = page.props;

    const breadcrumbs = useMemo(
        () => [
            { title: t.dashboard.breadcrumb, href: dashboard() },
            { title: p.breadcrumb, href: customersIndex() },
        ],
        [t.dashboard.breadcrumb, p.breadcrumb],
    );

    const tableLabels = useMemo(
        () => ({
            ...p,
            viewLedgerReport:
                t.customerLedgerReportPage.viewLedgerReport ?? p.viewLedgerReport,
            cancel: a.cancel,
            toastActionFailed: a.requestFailed,
            sectionPersonal: p.sectionPersonal,
            sectionContact: p.sectionContact,
            sectionDocuments: p.sectionDocuments,
            nationalCardNumber: p.nationalCardNumber,
            nationalCardImage: p.nationalCardImage,
            carImage: p.carImage,
            fullName: p.fullName,
            supplyZone: p.supplyZone,
            address: p.address,
            contactNumber: p.contactNumber,
            viewDocument: p.viewDocument,
        }),
        [p, a, t.customerLedgerReportPage.viewLedgerReport],
    );

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={p.headTitle} />
            <div className="flex h-full flex-1 flex-col gap-6 overflow-x-auto p-4">
                <Card>
                    <CardHeader className="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between sm:space-y-0">
                        <div className="space-y-2">
                            <CardTitle className="text-xl font-semibold tracking-tight">
                                {p.title}
                            </CardTitle>
                            <CardDescription className="max-w-2xl text-sm leading-relaxed">
                                {p.listSubtitle}
                            </CardDescription>
                        </div>
                        {canCreate ? (
                            <Button asChild className="shrink-0">
                                <Link href={customersCreate()} prefetch>
                                    <Plus className="size-4" />
                                    {p.addCustomer}
                                </Link>
                            </Button>
                        ) : null}
                    </CardHeader>
                    <CardContent>
                        <CustomersTable
                            customers={customers}
                            filters={filters}
                            labels={tableLabels}
                            indexUrl={customersIndex}
                            editUrl={(id) => customersEdit.url(id)}
                            statusUrl={(id) => customersUpdateStatus.url(id)}
                            accountUrl={(id) => customerAccount.url(id)}
                            oldDebtsUrl={(id) => customerOldDebts.url(id)}
                            loansUrl={(id) => `/customers/${id}/loans`}
                            canViewAccount={canViewAccount}
                            canViewLoans={canViewLoans}
                        />
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
