import { CommonModule } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { Chart, LineController, LineElement, PointElement, LinearScale, Title, CategoryScale, Tooltip, Filler } from 'chart.js';

@Component({
  selector: 'app-graph',
  standalone: true,
  imports: [CommonModule],
  templateUrl: './graph.component.html',
  styleUrls: ['./graph.component.scss']
})
export class GraphComponent implements OnInit {
  selectedSensor: string | null = null;
  parameters: string[] = []; 

  sensorParameters: { [key: string]: string[] } = {
    dht: ['Temperature', 'Humidity', 'Light'],
    npk1: ['Temperature', 'Moisture', 'Conductivity', 'ph', 'Nitrogen', 'Phosphorus', 'Potassium'],
    npk2: ['Temperature', 'Moisture', 'Conductivity', 'ph', 'Nitrogen', 'Phosphorus', 'Potassium']
  };

  dhtData = {
    humidity: [65, 59, 80, 81, 56, 55, 40, 41, 60, 65, 59, 80, 81, 56, 55, 40, 41, 60, 65, 59, 80, 81, 56, 55],
    temperature: [22, 23, 25, 24, 26, 27, 28, 29, 25, 23, 22, 24, 26, 27, 28, 29, 29, 28, 28, 25, 25, 25, 26, 27],
    light: [200, 220, 230, 210, 250, 240, 260, 265, 270, 200, 220, 230, 210, 250, 240, 260, 265, 270, 275, 280, 285, 290, 295, 300]
  };

  npk1Data = {
    temperature: [23, 24, 26, 27, 28, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 23, 24, 26, 27, 28, 29, 28, 27],
    moisture: [30, 35, 32, 36, 34, 37, 33, 31, 32, 30, 35, 32, 36, 34, 37, 33, 31, 32, 30, 35, 32, 36, 34, 37],
    conductivity: [500, 550, 600, 520, 510, 530, 540, 580, 590, 500, 550, 600, 520, 510, 530, 540, 580, 590, 500, 550, 600, 520, 510, 530],
    ph: [6.5, 6.7, 6.8, 7.0, 7.1, 6.9, 6.6, 6.8, 6.9, 6.5, 6.7, 6.8, 7.0, 7.1, 6.9, 6.6, 6.8, 6.9, 6.5, 6.7, 6.8, 7.0, 7.1, 6.9],
    nitrogen: [300, 310, 320, 330, 340, 350, 355, 360, 365, 300, 310, 320, 330, 340, 350, 355, 360, 365, 300, 310, 320, 330, 340, 350],
    phosphorus: [200, 210, 215, 220, 225, 220, 215, 210, 200, 210, 215, 220, 225, 220, 215, 210, 200, 210, 215, 220, 225, 220, 215, 210],
    potassium: [180, 190, 200, 205, 210, 215, 220, 225, 230, 180, 190, 200, 205, 210, 215, 220, 225, 230, 180, 190, 200, 205, 210, 215],
  };

  npk2Data = {
    temperature: [24, 25, 27, 28, 29, 28, 26, 25, 24, 23, 22, 21, 20, 19, 23, 24, 26, 27, 28, 29, 28, 26, 25, 24],
    moisture: [31, 36, 33, 38, 35, 37, 34, 32, 33, 31, 36, 33, 38, 35, 37, 34, 32, 33, 31, 36, 33, 38, 35, 37],
    conductivity: [520, 530, 540, 510, 550, 570, 580, 590, 600, 520, 530, 540, 510, 550, 570, 580, 590, 600, 520, 530, 540, 510, 550, 570],
    ph: [6.6, 6.9, 7.1, 6.7, 6.8, 6.9, 6.6, 6.8, 6.9, 6.6, 6.9, 7.1, 6.7, 6.8, 6.9, 6.6, 6.8, 6.9, 6.6, 6.9, 7.1, 6.7, 6.8, 6.9],
    nitrogen: [320, 330, 340, 350, 360, 400, 410, 420, 430, 320, 330, 340, 350, 360, 400, 410, 420, 430, 320, 330, 340, 350, 360, 400],
    phosphorus: [210, 220, 225, 230, 235, 240, 245, 250, 255, 210, 220, 225, 230, 235, 240, 245, 250, 255, 210, 220, 225, 230, 235, 240],
    potassium: [190, 195, 205, 210, 215, 220, 225, 230, 235, 190, 195, 205, 210, 215, 220, 225, 230, 235, 190, 195, 205, 210, 215, 220]
  };

  chart: any;
  labelHourly = [
    '01.00', '02.00', '03.00', '04.00', '05.00', '06.00', '07.00', '08.00',
    '09.00', '10.00', '11.00', '12.00', '13.00', '14.00', '15.00', '16.00',
    '17.00', '18.00', '19.00', '20.00', '21.00', '22.00', '23.00', '24.00'
  ];

  ngOnInit(): void {
    Chart.register(LineController, LineElement, PointElement, LinearScale, Title, CategoryScale, Tooltip, Filler);
    this.selectedSensor = 'dht';
    this.parameters = this.sensorParameters[this.selectedSensor];
    this.createChart(this.dhtData.temperature, 'Temperature', '#8F5A62', this.labelHourly);
  }

  createChart(data: number[], label: string, borderColor: string, labels: string[]): void {
    const canvas = document.getElementById('myChart') as HTMLCanvasElement;
    const ctx = canvas.getContext('2d');
  
    if (this.chart) {
      this.chart.destroy();
    }
  
    if (ctx) {
      this.chart = new Chart(ctx, {
        type: 'line',
        data: {
          labels: labels,
          datasets: [{
            label,
            data,
            borderColor,
            borderWidth: 1.5,
            fill: false,
            backgroundColor: borderColor + '4D',
            tension: 0.5,
            pointRadius: 5,
            pointHoverRadius: 8,
            pointBackgroundColor: borderColor,
          }]
        },
        options: {
          responsive: true,
          maintainAspectRatio: false,
          plugins: {
            tooltip: {
              enabled: true,
              mode: 'nearest',
              intersect: false,
            },
            legend: {
              display: true
            }
          },
          scales: {
            x: {
              beginAtZero: true
            },
            y: {
              beginAtZero: true
            }
          }
        }
      });
    }
  }

  onSensorChange(event: Event): void {
    const selectElement = event.target as HTMLSelectElement;
    this.selectedSensor = selectElement.value;
    this.parameters = this.sensorParameters[this.selectedSensor];
  
    const defaultParameter = this.parameters[0];
    (document.getElementById('parameterSelect') as HTMLSelectElement).value = defaultParameter;
  
    this.updateChart();
  }
  

  updateChart(): void {
    const parameter = (document.getElementById('parameterSelect') as HTMLSelectElement).value.toLowerCase();
  
    let newData: number[] | undefined;
    let newLabel: string = '';
    let newColor: string = '';
  
    const humidity = '#16423C';
    const temperature = '#8F5A62';
    const light = '#DF9B55';
    const moisture = '#54909c';
    const conductivity = '#661311';
    const ph = '#664735';
    const nitrogen = '#3a6635';
    const phosphorus = '#3f3566';
    const potassium = '#5f3566';
  
    switch (this.selectedSensor) {
      case 'dht':
        newData = this.dhtData[parameter as keyof typeof this.dhtData];
        newLabel = parameter.charAt(0).toUpperCase() + parameter.slice(1);
        newColor = (parameter === 'humidity') ? humidity :
                   (parameter === 'temperature') ? temperature : light;
        break;
      case 'npk1':
        newData = this.npk1Data[parameter as keyof typeof this.npk1Data];
        newLabel = parameter.charAt(0).toUpperCase() + parameter.slice(1);
        newColor = (parameter === 'temperature') ? temperature :
                   (parameter === 'moisture') ? moisture :
                   (parameter === 'conductivity') ? conductivity :
                   (parameter === 'ph') ? ph :
                   (parameter === 'nitrogen') ? nitrogen :
                   (parameter === 'phosphorus') ? phosphorus : potassium;
        break;
      case 'npk2':
        newData = this.npk2Data[parameter as keyof typeof this.npk2Data];
        newLabel = parameter.charAt(0).toUpperCase() + parameter.slice(1);
        newColor = (parameter === 'temperature') ? temperature :
                   (parameter === 'moisture') ? moisture :
                   (parameter === 'conductivity') ? conductivity :
                   (parameter === 'ph') ? ph :
                   (parameter === 'nitrogen') ? nitrogen :
                   (parameter === 'phosphorus') ? phosphorus : potassium;
        break;
      default:
        console.error('Sensor tidak ditemukan');
        return;
    }
    this.createChart(newData!, newLabel, newColor, this.labelHourly);
  }
}
