import { Injectable } from '@angular/core';
import { Configuration } from 'ng-chartist';

import { BarConfig, DoughnutConfig, LineConfig } from 'src/app/core/models';

@Injectable({ providedIn: 'root' })
export class UtilitiesService {
    private _coeffKgLbs: number = 2.20462;
    private _coeffFtM: number = 0.092903;

    constructor() { }

    getCoeffKgLbs(): number {
        return this._coeffKgLbs;
    }

    getCoeffFtM(): number {
        return this._coeffFtM;
    }

    getBarConfig(): Configuration {
        let config: Configuration = {
            type: 'Bar',
            data: {
                "labels": [],
                "series": []
            },
            options: {},
            responsiveOptions: []
        };
        return config;
    }

    getChartColors(): string[] {
        let colors: string[] = [
            'ct-color-a',
            'ct-color-b',
            'ct-color-c',
            'ct-color-d',
            'ct-color-e',
            'ct-color-f',
            'ct-color-g',
            'ct-color-h',
            'ct-color-i',
            'ct-color-j',
            'ct-color-k',
            'ct-color-l',
            'ct-color-m',
            'ct-color-n',
            'ct-color-o',
            'ct-color-p',
            'ct-color-q',
            'ct-color-r'
        ];
        return colors;
    }

    getCurrentDateFr(): string {
        return  new Date().toLocaleDateString("fr");
    }

    getSeriesColors(opacity: number, palette: string = 'all'): string[] {
        let colors: string[] = [];
        switch (palette) {
            case 'red':
                colors = [
                    `rgba(163, 0, 0, ${opacity})`,
                    `rgba(178, 47, 25, ${opacity})`,
                    `rgba(192, 74, 49, ${opacity})`,
                    `rgba(205, 99, 72, ${opacity})`,
                    `rgba(217, 122, 97, ${opacity})`,
                    `rgba(228, 145, 122, ${opacity})`,
                    `rgba(238, 168, 148, ${opacity})`,
                    `rgba(247, 192, 175, ${opacity})`,
                    `rgba(255, 215, 203, ${opacity})`
                ];
                break;
            case 'green':
                colors = [
                    `rgba(0, 109, 45, ${opacity})`,
                    `rgba(42, 124, 64, ${opacity})`,
                    `rgba(67, 140, 83, ${opacity})`,
                    `rgba(90, 155, 102, ${opacity})`,
                    `rgba(112, 171, 122, ${opacity})`,
                    `rgba(134, 187, 142, ${opacity})`,
                    `rgba(156, 203, 163, ${opacity})`,
                    `rgba(179, 219, 184, ${opacity})`,
                    `rgba(201, 235, 205, ${opacity})`
                ];
                break;
            case 'blue':
                colors = [
                    `rgba(0, 76, 109, ${opacity})`,
                    `rgba(37, 94, 126, ${opacity})`,
                    `rgba(61, 112, 143, ${opacity})`,
                    `rgba(83, 131, 161, ${opacity})`,
                    `rgba(105, 150, 179, ${opacity})`,
                    `rgba(127, 170, 198, ${opacity})`,
                    `rgba(148, 190, 217, ${opacity})`,
                    `rgba(171, 210, 236, ${opacity})`,
                    `rgba(193, 231, 255, ${opacity})`
                ];
                break;
            case 'all':
            default:
                colors = [
                    `rgba(32, 182, 252, ${opacity})`,
                    `rgba(241, 80, 80, ${opacity})`,
                    `rgba(2, 191, 171, ${opacity})`,
                    `rgba(255, 153, 0, ${opacity})`,
                    `rgba(101, 218, 224, ${opacity})`,
                    `rgba(138, 101, 224, ${opacity})`,
                    `rgba(0, 137, 123, ${opacity})`,
                    `rgba(181, 17, 86, ${opacity})`,
                    `rgba(93, 204, 137, ${opacity})`,
                    `rgba(255, 226, 5, ${opacity})`,
                    `rgba(191, 101, 224, ${opacity})`,
                    `rgba(76, 174, 76, ${opacity})`,
                    `rgba(51, 122, 183, ${opacity})`,
                    `rgba(237, 80, 148, ${opacity})`,
                    `rgba(253, 24, 243, ${opacity})`,
                    `rgba(214, 31, 31, ${opacity})`,
                    `rgba(153, 171, 180, ${opacity})`,
                    `rgba(205, 186, 152, ${opacity})`,
                    `rgba(101, 224, 184, ${opacity})`,
                    `rgba(2, 191, 171, ${opacity})`,
                    `rgba(101, 218, 224, ${opacity})`,
                    `rgba(161, 199, 161, ${opacity})`,
                    `rgba(217, 202, 174, ${opacity})`,
                    `rgba(151, 136, 199, ${opacity})`,
                    `rgba(212, 206, 112, ${opacity})`,
                    `rgba(255, 255, 255, ${opacity})`
                ];
                break;
        }
        return colors;
    }

    getDoughnutChartConfig(): DoughnutConfig {
        let config: DoughnutConfig = {
            doughnutChartLabels: [],
            doughnutChartDatasets: [
                {
                    data: [],
                    label: 'Nombre total de sauts',
                    backgroundColor: this.getSeriesColors(0.8),
                    borderColor: this.getSeriesColors(1), // 'rgba(255, 255, 255, 1)'
                    borderWidth: 2
                }
            ],
            doughnutChartOptions: {
                elements: {
                    arc: {
                        borderWidth: 2,
                    }
                },
                plugins: {
                    legend: {
                        display: true,
                        position: 'left'
                    }
                },
                responsive: true
            },
            doughnutChartLegend: false
        };
        return config;
    }

    getBarChartConfig(): BarConfig {
        let config: BarConfig = {
            barChartData: {
                labels: [''],
                datasets: []
            },
            barChartOptions: {
                elements: {
                    bar: {
                        borderWidth: 1,
                    }
                },
                responsive: true
            },
            barChartPlugins: [],
            barChartLegend: false
        };
        return config;
    }

    getHorizontalBarChartConfig(): BarConfig {
        let config: BarConfig = {
            barChartData: {
                labels: [''],
                datasets: []
            },
            barChartOptions: {
                indexAxis: 'y',
                elements: {
                    bar: {
                        borderWidth: 1,
                    }
                },
                plugins: {
                    legend: {
                        display: true,
                        position: 'left'
                    },
                    title: {
                        display: false,
                        text: 'Nombre total de sauts'
                    }
                },
                responsive: true,
                aspectRatio: 3,
                scales: {
                    x: {
                        beginAtZero: true,
                        ticks: { color: 'rgba(255,255,255,0.3)' },
                        grid: { color: 'rgba(255,255,255,0.2)', display: true, tickBorderDash: [1,2] }
                    },
                    y: {
                        beginAtZero: true,
                        ticks: { color: 'rgba(255,255,255,0.3)' },
                        grid: { color: 'rgba(255,255,255,0.3)', display: false }
                    }
                }
            },
            barChartPlugins: [],
            barChartLegend: false
        };
        return config;
    }

    getLineChartConfig(): LineConfig {
        let config: LineConfig = {
            lineChartData: {
                labels: [],
                datasets: []
            },
            lineChartOptions: {
                plugins: {
                    legend: {
                        display: true,
                        position: 'bottom'
                    }
                },
                interaction: {
                    intersect: false,
                    axis: 'x'
                },
                scales: {
                    x: {
                        display: false,
                    },
                    y: {
                        display: true,
                        min: 60,
                        max: 200,
                        ticks: { color: 'rgba(255,255,255,0.3)' },
                        grid: { color: 'rgba(255,255,255,0.3)', display: true }
                    }
                },
                responsive: true,
                maintainAspectRatio: true
            },
            lineChartLegend: true
        };
        return config;
    }
}
