import React, { useState, useEffect } from 'react';
import { Alert, Loading } from '.';
import { AlertsChartData, TrendChartData } from '../types';
import { Line } from 'react-chartjs-2';

interface GasChartProps { 
    type: "daily" | "hourly"
}

export const GasChart = (props: GasChartProps) => {
    const defaultTimePeriod = props.type === "daily" ? 7 : 24
    const [loading, setLoading] = useState(true);
    const [timePeriod, setTimePeriod] = useState(defaultTimePeriod);
    const [chartData, setChartData] = useState<any>();

    useEffect(() => {
        async function asyncEffect() {
            try {
                let body: TrendChartData | null = null;
                let registrations: AlertsChartData | null = null;

                if (props.type === "daily") { 
                    const response = await fetch(`/.netlify/functions/trend?days=${timePeriod}`);
                    body = await response.json() as TrendChartData;

                    const regResponse = await fetch(`/.netlify/functions/registrations?days=${timePeriod}`);
                    registrations = await regResponse.json() as AlertsChartData;
                }
                if (props.type === "hourly") { 
                    const response = await fetch(`/.netlify/functions/trend?hours=${timePeriod}`);
                    body = await response.json() as TrendChartData;
                }
                if (body === null) { 
                    console.log("Error retrieving gas chart data");
                    return;
                }

                const chartData = {
                    labels: body.labels,
                    datasets: [{
                        label: "Slow",
                        borderColor: "#FFFF9D",
                        borderWidth: "1",
                        data: body.slow
                    },
                    {
                        label: "Normal",
                        borderColor: "#FEDA6A",
                        borderWidth: "1",
                        data: body.normal,  
                    },
                    {
                        label: "Fast",
                        borderColor: "#CBA737",
                        borderWidth: "1",
                        data: body.fast,
                    },
                    {
                        label: "Instant",
                        borderColor: "#654100",
                        borderWidth: "1",
                        data: body.instant,
                    },],
                    options: {
                        legend: {
                            display: true,
                            position: 'top'
                        },
                        tooltips: {
	                        mode: 'index',
	                        intersect: false,
    	                },
                    }
                };

                if (registrations) { 
                    chartData.datasets.push(
                        {
                            label: "Registrations",
                            borderColor: "#dc3545",
                            borderWidth: "1",
                            data: registrations.registrations,
                        })
                }

                setChartData(chartData);
            } catch (ex) { 
                console.log("Couldn't retrieve gas chart data", ex);
            }

            setLoading(false);
        }
        
        asyncEffect();
    }, [timePeriod, props.type]);
    
    if (loading) { 
        return <Loading />
    }

    if (!chartData) { 
        return <Alert type="danger" message="Couldn't retrieve gas chart data." />
    } 

    const dailyOptions = (<>
        <option value={7}>Last week</option>
        <option value={14}>Last 2 weeks</option>
        <option value={30}>Last month</option>
    </>);

    const hourlyOptions = (<>
        <option value={24}>Last 24 hours</option>
        <option value={72}>Last 3 days</option>
        <option value={168}>Last week</option>
    </>);

    return (
        <div className="mt-4 mb-4">
            <h2 className="text-capitalize">{props.type} average gas prices</h2>

            <div className="input-group input-group-sm col-6 col-sm-4 mb-3 float-right">
                <select className="custom-select" id="inputPeriodSelector" value={timePeriod} onChange={e => setTimePeriod(Number(e.target.value))}>
                    {props.type === "daily" ? dailyOptions : <></>}
                    {props.type === "hourly" ? hourlyOptions : <></>}
                </select>
            </div>

            <div>
                <Line data={chartData} options={chartData.options} />
            </div>
        </div>
    );
}