import DayNavigator from '@/Components/DayNavigator';
import ExportButton from '@/Components/ExportButton';
import PrintButton from '@/Components/PrintButton';
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import { capitalize, t } from '@/lib/utils';
import BarMetricChart from '@/Pages/Metric/BarMetricChart';
import MetricMeasure from '@/Pages/Metric/MetricMeasure';
import MetricSummaryCard from '@/Pages/Metric/MetricSummaryCard';
import { AggregatedMetricData, Step, User } from '@/types';
import { Head, router, usePage } from '@inertiajs/react';
import dayjs, { Dayjs } from 'dayjs';
import { useState } from 'react';

interface MetricDetailProps {
    measures: Step[];
    metricName: string;
    patient: User;
    measuresByHour: AggregatedMetricData[];
}

export default function StepsMetricDetail({
    measures,
    measuresByHour,
    metricName,
    patient,
}: MetricDetailProps) {
    const user = usePage().props.auth.user;
    const now = dayjs();
    const { filters } = usePage().props;
    const [date, setDate] = useState(filters?.date || now.format('YYYY-MM-DD'));

    const onDateChange = (updatedDate: Dayjs) => {
        const dateString = dayjs(updatedDate).format('YYYY-MM-DD');
        setDate(dateString);

        // Immediately send search request
        router.get(
            route('steps.detail', { patient: patient.id }),
            {
                date: dateString,
            },
            {
                preserveState: true,
                preserveScroll: true,
                replace: true, // Prevent duplicate history entries
            },
        );
    };

    const backLinkLabel =
        patient.id === user.id
            ? 'Dashboard'
            : `${patient.name} ${patient.surname}`;

    const data = measuresByHour.map((measure) => {
        return {
            date: dayjs(measure.date).format('HH:mm'),
            value: measure.sum,
        };
    });

    const total = measures.reduce((sum, measure) => sum + measure.value, 0);

    return (
        <AuthenticatedLayout
            backLink={route('dashboard.personal', { target: patient.id })}
            backLinkLabel={backLinkLabel}
        >
            <Head title={capitalize(t(metricName))} />

            <div className="py-2">
                <div className="mx-auto max-w-7xl sm:px-6 lg:px-8">
                    <div className="overflow-hidden sm:rounded-lg">
                        <div className="p-6 text-gray-900">
                            <div className="scroll-m-20 pb-8 text-4xl font-semibold tracking-tight lg:text-5xl">
                                Passi
                            </div>
                            <div className="flex justify-center gap-2 md:justify-end">
                                <PrintButton />
                                <ExportButton
                                    href={route('steps.detail.export', {
                                        patient: patient.id,
                                    })}
                                />
                                <DayNavigator
                                    date={dayjs(date)}
                                    onChange={onDateChange}
                                />
                            </div>
                            <div>
                                <BarMetricChart data={data} />
                            </div>
                            <div className="flex w-full justify-center">
                                <div className="max-w-2xl">
                                    <div className="mt-8 flex gap-4 md:flex-row">
                                        <MetricSummaryCard
                                            title="Totale"
                                            value={`${total} passi`}
                                            className="align-right bg-neutral-100 md:max-w-[40%]"
                                        />
                                    </div>
                                    <div className="mt-8 text-zinc-500">
                                        Monitorare i passi ti aiuta a mantenere
                                        uno stile di vita attivo e sano.
                                        Camminare regolarmente migliora la
                                        salute del cuore, aiuta a gestire il
                                        peso e riduce lo stress.
                                    </div>
                                    <div className="mt-8">
                                        <h2 className="mb-4 font-semibold">
                                            Misurazioni
                                        </h2>
                                        <div className="flex flex-row flex-col gap-4">
                                            <ul>
                                                {measures.map((measure) => (
                                                    <MetricMeasure
                                                        key={measure.id}
                                                        value={`${measure.value} passi`}
                                                        measuredAt={dayjs(
                                                            measure.measured_at,
                                                        )}
                                                        deviceName={
                                                            measure.device_label ??
                                                            measure.device_name
                                                        }
                                                    />
                                                ))}
                                            </ul>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </AuthenticatedLayout>
    );
}
