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 LineMetricChart from '@/Pages/Metric/LineMetricChart';
import MetricMeasure from '@/Pages/Metric/MetricMeasure';
import MetricPeriodSummary from '@/Pages/Metric/MetricPeriodSummary';
import MetricSummaryCard from '@/Pages/Metric/MetricSummaryCard';
import { AggregatedMetricData, HeartRate, MetricPeriod, User } from '@/types';
import { Head, router, usePage } from '@inertiajs/react';
import dayjs, { Dayjs } from 'dayjs';
import { useState } from 'react';

interface MetricDetailProps {
    measures: HeartRate[];
    metricName: string;
    patient: User;
    availableDates: string[];
    period: MetricPeriod | null;
    measuresByHour: AggregatedMetricData[];
}

export default function HeartRateMetricDetail({
    measures,
    measuresByHour,
    metricName,
    patient,
    availableDates,
    period,
}: 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('heart-rate.detail', { patient: patient.id }),
            {
                date: dateString,
            },
            {
                preserveState: true,
                preserveScroll: true,
                replace: true, // Prevent duplicate history entries
            },
        );
    };

    const onRangeChange = (from: Dayjs, to: Dayjs) => {
        router.get(
            route('heart-rate.detail', { patient: patient.id }),
            {
                from: from.format('YYYY-MM-DD'),
                to: to.format('YYYY-MM-DD'),
            },
            { preserveState: true, preserveScroll: true, replace: true },
        );
    };

    const periodData = period
        ? period.data.map((point) => ({
              date: dayjs(point.date).format(
                  period.byMonth ? 'MM/YYYY' : 'DD/MM',
              ),
              average: point.average,
              min: point.min,
              max: point.max,
          }))
        : [];

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

    const ascSortedMeasures = [...measures].sort((a, b) => a.value - b.value);

    const min = measures.length ? ascSortedMeasures[0].value : null;
    const max = measures.length
        ? ascSortedMeasures[ascSortedMeasures.length - 1].value
        : null;

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

    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">
                                Frequenza cardiaca
                            </div>
                            <div className="flex justify-center gap-2 md:justify-end">
                                <PrintButton />
                                <ExportButton
                                    href={route('heart-rate.detail.export', {
                                        patient: patient.id,
                                    })}
                                />
                                <DayNavigator
                                    date={dayjs(date)}
                                    onChange={onDateChange}
                                    availableDates={availableDates}
                                    range={
                                        period
                                            ? {
                                                  from: dayjs(period.from),
                                                  to: dayjs(period.to),
                                              }
                                            : null
                                    }
                                    onRangeChange={onRangeChange}
                                />
                            </div>
                            <div>
                                <div>
                                    <LineMetricChart
                                        data={period ? periodData : data}
                                    />
                                </div>
                                <div className="flex w-full justify-center">
                                    <div className="max-w-2xl">
                                        <div>
                                            {period ? (
                                                <MetricPeriodSummary
                                                    average={
                                                        period.summary
                                                            ? `${period.summary.average} bpm`
                                                            : null
                                                    }
                                                    max={
                                                        period.summary
                                                            ? `${period.summary.max} bpm`
                                                            : null
                                                    }
                                                    min={
                                                        period.summary
                                                            ? `${period.summary.min} bpm`
                                                            : null
                                                    }
                                                    caption={
                                                        period.summary
                                                            ? `${period.summary.count} misurazioni dal ${dayjs(period.from).format('DD/MM/YYYY')} al ${dayjs(period.to).format('DD/MM/YYYY')}`
                                                            : null
                                                    }
                                                />
                                            ) : (
                                                <div className="mt-8 flex gap-4 md:flex-row">
                                                    <MetricSummaryCard
                                                        title="Massimo"
                                                        value={
                                                            max
                                                                ? `${max} bpm`
                                                                : null
                                                        }
                                                        className="bg-neutral-200"
                                                    />
                                                    <MetricSummaryCard
                                                        title="Minimo"
                                                        value={
                                                            min
                                                                ? `${min} bpm`
                                                                : null
                                                        }
                                                        className="bg-neutral-100"
                                                    />
                                                </div>
                                            )}
                                            <div className="mt-8 text-zinc-500">
                                                La frequenza cardiaca indica i
                                                battiti del cuore al minuto ed è
                                                un segnale importante per
                                                valutare il tuo stato di salute.
                                                Un valore normale a riposo è tra
                                                60 e 100 bpm: se troppo alta o
                                                bassa potrebbe indicare problemi
                                                come stress, disidratazione o
                                                condizioni cardiache.
                                            </div>
                                            {!period && (
                                                <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} bpm`}
                                                                        measuredAt={dayjs(
                                                                            measure.measured_at,
                                                                        )}
                                                                        deviceName={
                                                                            measure.device_label ??
                                                                            measure.device_name
                                                                        }
                                                                    />
                                                                ),
                                                            )}
                                                        </ul>
                                                    </div>
                                                </div>
                                            )}
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </AuthenticatedLayout>
    );
}
