import DayNavigator from '@/Components/DayNavigator';
import ExportButton from '@/Components/ExportButton';
import PrintButton from '@/Components/PrintButton';
import {
    ChartConfig,
    ChartContainer,
    ChartTooltip,
    ChartTooltipContent,
} from '@/Components/ui/chart';
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import MetricChart from '@/Pages/Metric/MetricChart';
import MetricMeasure from '@/Pages/Metric/MetricMeasure';
import MetricSummaryCard from '@/Pages/Metric/MetricSummaryCard';
import { DynamicBloodPressure, HolterSummary, User } from '@/types';
import { Head, router, usePage } from '@inertiajs/react';
import dayjs, { Dayjs } from 'dayjs';
import { useState } from 'react';
import { Line, LineChart, XAxis, YAxis } from 'recharts';

interface HolterPressorioDetailProps {
    measures: DynamicBloodPressure[];
    summary: HolterSummary;
    patient: User;
    availableDates: string[];
    filters: { date: string };
}

export default function HolterPressorioDetail({
    measures,
    summary,
    patient,
    availableDates,
    filters,
}: HolterPressorioDetailProps) {
    const user = usePage().props.auth.user;
    const [date, setDate] = useState(
        filters?.date || dayjs().format('YYYY-MM-DD'),
    );

    const onDateChange = (updatedDate: Dayjs) => {
        const dateString = dayjs(updatedDate).format('YYYY-MM-DD');
        setDate(dateString);
        router.get(
            route('holter.detail', { patient: patient.id }),
            { date: dateString },
            { preserveState: true, preserveScroll: true, replace: true },
        );
    };

    const chartConfig: ChartConfig = {
        systolic: { label: 'Sistolica', color: '#05A7A0' },
        diastolic: { label: 'Diastolica', color: '#7dd3d0' },
    };

    // measures arrive most-recent-first; the chart needs chronological order on the x-axis.
    const chartData = [...measures]
        .sort(
            (a, b) =>
                dayjs(a.measured_at).valueOf() - dayjs(b.measured_at).valueOf(),
        )
        .map((m) => ({
            date: dayjs(m.measured_at).format('HH:mm'),
            systolic: m.systolic,
            diastolic: m.diastolic,
        }));

    const pair = (p: { systolic: number | null; diastolic: number | null }) =>
        p.systolic !== null && p.diastolic !== null
            ? `${p.systolic}/${p.diastolic} mmHg`
            : undefined;

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

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

            <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">
                                Holter pressorio
                            </div>
                            <div className="flex justify-center gap-2 md:justify-end">
                                <PrintButton />
                                <ExportButton
                                    href={route('holter.detail.export', {
                                        patient: patient.id,
                                    })}
                                />
                                <DayNavigator
                                    date={dayjs(date)}
                                    onChange={onDateChange}
                                    availableDates={availableDates}
                                />
                            </div>
                            <div>
                                <MetricChart>
                                    <ChartContainer
                                        config={chartConfig}
                                        className="h-[120px] w-full lg:h-[180px]"
                                    >
                                        <LineChart
                                            data={chartData}
                                            margin={{
                                                top: 4,
                                                bottom: 0,
                                                left: 24,
                                                right: 24,
                                            }}
                                        >
                                            <XAxis
                                                className="font-semibold uppercase text-neutral-500"
                                                dataKey="date"
                                                tickLine={false}
                                                axisLine={false}
                                                tickMargin={8}
                                                tick={{ fill: '#69cac6' }}
                                                minTickGap={32}
                                            />
                                            <YAxis
                                                tickLine={false}
                                                axisLine={false}
                                                tickMargin={30}
                                                tick={{ fill: '#69cac6' }}
                                            />
                                            <ChartTooltip
                                                content={
                                                    <ChartTooltipContent />
                                                }
                                            />
                                            <Line
                                                dataKey="systolic"
                                                type="natural"
                                                stroke="var(--color-systolic)"
                                                strokeWidth={2}
                                                dot={false}
                                                activeDot={{ r: 6 }}
                                            />
                                            <Line
                                                dataKey="diastolic"
                                                type="natural"
                                                stroke="var(--color-diastolic)"
                                                strokeWidth={2}
                                                dot={false}
                                                activeDot={{ r: 6 }}
                                            />
                                        </LineChart>
                                    </ChartContainer>
                                </MetricChart>
                            </div>
                            <div className="flex w-full justify-center">
                                <div className="max-w-2xl">
                                    <div className="mt-8 flex flex-wrap gap-4">
                                        <MetricSummaryCard
                                            title="Media 24h"
                                            value={pair(summary.avg_24h)}
                                            className="bg-neutral-200"
                                        />
                                        <MetricSummaryCard
                                            title="Media giorno"
                                            value={pair(summary.avg_day)}
                                            className="bg-neutral-100"
                                        />
                                        <MetricSummaryCard
                                            title="Media notte"
                                            value={pair(summary.avg_night)}
                                            className="bg-neutral-100"
                                        />
                                    </div>
                                    <div className="mt-4 flex flex-wrap gap-4">
                                        <MetricSummaryCard
                                            title="Massima"
                                            value={pair(summary.max)}
                                            className="bg-neutral-100"
                                        />
                                        <MetricSummaryCard
                                            title="Minima"
                                            value={pair(summary.min)}
                                            className="bg-neutral-100"
                                        />
                                        <MetricSummaryCard
                                            title="Battito medio"
                                            value={
                                                summary.avg_pulse !== null
                                                    ? `${summary.avg_pulse} bpm`
                                                    : undefined
                                            }
                                            className="bg-neutral-100"
                                        />
                                    </div>
                                    <div className="mt-8 text-zinc-500">
                                        Il Holter pressorio registra
                                        automaticamente la pressione a
                                        intervalli programmati nell'arco della
                                        giornata. Le medie sono distinte tra
                                        periodo diurno e notturno (notte
                                        22:00–06:00): un calo della pressione
                                        notturna superiore al 10% rispetto al
                                        giorno è considerato fisiologico.{' '}
                                        {summary.count} misurazioni in questa
                                        giornata ({summary.day_count} di giorno,{' '}
                                        {summary.night_count} di notte).
                                    </div>
                                    <div className="mt-8">
                                        <h2 className="mb-4 font-semibold">
                                            Misurazioni
                                        </h2>
                                        <ul>
                                            {measures.map((measure) => (
                                                <MetricMeasure
                                                    key={measure.id}
                                                    value={`${measure.systolic}/${measure.diastolic} mmHg${measure.pulse_rate ? ` · ${measure.pulse_rate} bpm` : ''}`}
                                                    measuredAt={dayjs(
                                                        measure.measured_at,
                                                    )}
                                                    deviceName={
                                                        measure.device_label ??
                                                        measure.device_name
                                                    }
                                                />
                                            ))}
                                        </ul>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </AuthenticatedLayout>
    );
}
