import { Head, Link, router, usePage } from '@inertiajs/react';
import { Plus } from 'lucide-react';
import { useCallback, useMemo, useState } from 'react';
import { create as expenseDaysCreate, index as expensesIndex } from '@/actions/App/Http/Controllers/ExpenseDayController';
import { ExpenseDaysDataTable } from '@/components/expenses/expense-day-tables';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { AppDateInput } from '@/components/ui/app-date-input';
import { useLanguage } from '@/contexts/language-context';
import AppLayout from '@/layouts/app-layout';
import { dashboard } from '@/routes';

const QUICK_RANGE_LABELS = {
    today: 'quickToday',
    yesterday: 'quickYesterday',
    this_week: 'quickThisWeek',
    this_month: 'quickThisMonth',
    this_year: 'quickThisYear',
};

export default function ExpensesIndex() {
    const { t } = useLanguage();
    const p = t.expensesPage;
    const page = usePage();
    const auth = page.props.auth ?? {};
    const canCreate = auth.canCreateExpenses === true;
    const { expenseDays = [], filters = {} } = page.props;
    const [dateFrom, setDateFrom] = useState(filters.date_from ?? '');
    const [dateTo, setDateTo] = useState(filters.date_to ?? '');

    const breadcrumbs = useMemo(
        () => [
            { title: t.dashboard.breadcrumb, href: dashboard() },
            { title: p.breadcrumb, href: expensesIndex() },
        ],
        [t.dashboard.breadcrumb, p.breadcrumb],
    );

    const applyFilters = useCallback((extra = {}) => {
        router.get(
            expensesIndex.url({ query: { date_from: dateFrom, date_to: dateTo, ...extra } }),
            {},
            { preserveState: true, preserveScroll: true },
        );
    }, [dateFrom, dateTo]);

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={p.headTitle} />
            <div className="flex h-full flex-1 flex-col gap-6 overflow-x-auto p-4">
                <div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
                    <div>
                        <h1 className="text-2xl font-semibold tracking-tight">{p.headTitle}</h1>
                        <p className="text-muted-foreground text-sm">{p.listSubtitle}</p>
                    </div>
                    {canCreate ? (
                        <Button asChild>
                            <Link href={expenseDaysCreate()} prefetch>
                                <Plus className="me-2 size-4" />
                                {p.createDateExpense}
                            </Link>
                        </Button>
                    ) : null}
                </div>

                <Card>
                    <CardHeader>
                        <CardTitle>{p.headTitle}</CardTitle>
                        <CardDescription>{p.listSubtitle}</CardDescription>
                    </CardHeader>
                    <CardContent className="space-y-4">
                        <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
                            <div className="space-y-2">
                                <Label htmlFor="date_from">{p.dateFrom}</Label>
                                <AppDateInput id="date_from" value={dateFrom} onChange={setDateFrom} />
                            </div>
                            <div className="space-y-2">
                                <Label htmlFor="date_to">{p.dateTo}</Label>
                                <AppDateInput id="date_to" value={dateTo} onChange={setDateTo} />
                            </div>
                        </div>
                        <div className="flex flex-wrap gap-2">
                            {Object.entries(QUICK_RANGE_LABELS).map(([range, labelKey]) => (
                                <Button
                                    key={range}
                                    type="button"
                                    size="sm"
                                    variant={filters.quick_range === range ? 'default' : 'outline'}
                                    onClick={() => router.get(expensesIndex.url({ query: { quick_range: range } }))}
                                >
                                    {p[labelKey]}
                                </Button>
                            ))}
                        </div>
                        <div className="flex flex-wrap gap-2">
                            <Button type="button" onClick={() => applyFilters()}>{p.applyFilters}</Button>
                            <Button type="button" variant="outline" onClick={() => router.get(expensesIndex.url())}>{p.resetFilters}</Button>
                        </div>
                        <ExpenseDaysDataTable expenseDays={expenseDays} labels={p} canCreate={canCreate} />
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
