import { DataTable } from '@/components/data-table';
import { useTranslation } from '@/hooks/use-translation';
import AppLayout from '@/layouts/app-layout';
import { Review, type BreadcrumbItem } from '@/types';
import { Head, router, usePage } from '@inertiajs/react';
import React, { useEffect, useRef } from 'react';
import { toast } from 'sonner';
import { getColumns } from './columns';
import { FiltersCard } from './filters-card';
import { TabsSwitcher, type CurrentFilters } from './tabs-switcher';

interface UnifiedItem extends Review {
    type: 'review' | 'questionnaire';
}

interface PageProps {
    items: UnifiedItem[];
    dateFrom: string;
    dateTo: string;
    logements: { id: number; name: string; internal_name?: string | null; [key: string]: unknown }[];
    coHosts: { id: string | number; name: string }[];
    sources: string[];
    auth: { isAdmin: boolean; permissions: string[] };
    flash?: { type: string; message: string };
    currentFilters?: CurrentFilters;
    [key: string]: unknown;
}

export default function Index() {
    const { t } = useTranslation();
    const { items, dateFrom, dateTo, logements, coHosts, sources, auth, flash, currentFilters } =
        usePage<PageProps>().props;

    const breadcrumbs: BreadcrumbItem[] = [
        { title: t('reviews', 'reviews'), href: '/reviews' },
    ];

    const [coHost, setCoHost] = React.useState(currentFilters?.coHost ?? '');
    const [dateRange, setDateRange] = React.useState({ from: dateFrom, to: dateTo });
    const [state, setState] = React.useState<string>(currentFilters?.state ?? 'tous');
    const [logement, setLogement] = React.useState<string>(currentFilters?.logement ?? '');
    const [minRating, setMinRating] = React.useState<string>(currentFilters?.minRating ?? '0');
    const [source, setSource] = React.useState<string>(currentFilters?.source ?? 'tous');

    useEffect(() => {
        if (flash?.type === 'success') toast.success(flash.message);
        else if (flash?.type === 'error') toast.error(flash.message);
    }, [flash]);

    // Skip URL sync on first render — otherwise the default dateRange ("this year") would
    // be auto-pushed to the URL and force a date filter, hiding reviews from older years
    // or with NULL ru_created_at. Only push when the user actually changes something.
    const isFirstRender = useRef(true);

    useEffect(() => {
        if (isFirstRender.current) {
            isFirstRender.current = false;
            return;
        }
        const delayDebounceFn = setTimeout(() => {
            const data: Record<string, string | object | undefined> = { dateRange, state, logement, minRating, source };
            if (coHost) data.coHost = coHost;
            router.get(route('reviews'), data as never, { preserveState: true, replace: true });
        }, 200);

        return () => clearTimeout(delayDebounceFn);
    }, [dateRange, state, logement, minRating, source, coHost]);

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={t('reviews', 'reviews')} />
            <div className="flex h-full flex-1 flex-col rounded-xl">
                <div className="bg-secondary rounded-b-2xl px-2 pb-1 lg:px-4">
                    <FiltersCard
                        filters={{
                            dateRange,
                            setDateRange,
                            state,
                            setState,
                            logement,
                            setLogement,
                            minRating,
                            setMinRating,
                            source,
                            setSource,
                            coHost,
                            setCoHost,
                        }}
                        logements={logements}
                        coHosts={coHosts}
                        sources={sources}
                        isAdmin={auth.isAdmin}
                        refreshRoute="reviews"
                        t={t}
                    />
                </div>
                <div id="main-container" className="px-2 lg:px-4">
                    <TabsSwitcher active="reviews" filters={currentFilters ?? {}} t={t} />
                    <DataTable columns={getColumns(t)} data={items} />
                </div>
            </div>
        </AppLayout>
    );
}
