'use client';

import { useEffect, useState } from 'react';
import dynamic from 'next/dynamic';
import { ApexOptions } from 'apexcharts';
import { useTheme } from 'next-themes';
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { ExternalLink } from "lucide-react";
import Link from "next/link";

// Dynamically import ApexCharts to avoid SSR issues
const Chart = dynamic(() => import('react-apexcharts'), { ssr: false });

interface NamaBeasiswaData {
  tahun_angkatan: number;
  nama_beasiswa: string;
  jumlah_nama_beasiswa: number;
}

interface Props {
  selectedYear: string;
}

interface NamaBeasiswaDashChartProps extends Props {
  height?: string;
  showDetailButton?: boolean;
}

export default function NamaBeasiswaDashChart({ 
  selectedYear, 
  height = "h-[300px] sm:h-[300px] md:h-[300px]",
  showDetailButton = true 
}: NamaBeasiswaDashChartProps) {
  const { theme } = useTheme();
  const [data, setData] = useState<NamaBeasiswaData[]>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);
  const [chartOptions, setChartOptions] = useState<ApexOptions>({});

  useEffect(() => {
    const fetchData = async () => {
      try {
        setLoading(true);
        setError(null);
        
        const url = `/api/mahasiswa/nama-beasiswa-dashboard?tahunAngkatan=${selectedYear}`;
        
        const response = await fetch(url);
        
        if (!response.ok) {
          throw new Error(`Failed to fetch data: ${response.status} ${response.statusText}`);
        }
        
        const result = await response.json();
        
        if (!Array.isArray(result)) {
          throw new Error('Invalid data format received from server');
        }
        
        // Sort data by tahun_angkatan
        const sortedData = result.sort((a: NamaBeasiswaData, b: NamaBeasiswaData) => 
          a.tahun_angkatan - b.tahun_angkatan
        );
        
        setData(sortedData);
        
        // Update chart options dengan categories yang benar
        const years = [...new Set(sortedData.map(item => item.tahun_angkatan))].sort();
        updateChartOptions(years);
      } catch (err) {
        console.error('Error in fetchData:', err);
        setError(err instanceof Error ? err.message : 'An error occurred while fetching data');
      } finally {
        setLoading(false);
      }
    };

    fetchData();
  }, [selectedYear, theme]);

  // Initialize chart options on mount
  useEffect(() => {
    updateChartOptions([]);
  }, []);

  // Function to update chart options
  const updateChartOptions = (years: number[]) => {
    console.log('Updating chart options with years:', years);
    setChartOptions({
      chart: {
        type: 'bar',
        stacked: true,
        toolbar: {
          show: true,
          tools: {
            download: true,
            selection: true,
            zoom: true,
            zoomin: true,
            zoomout: true,
            pan: true,
            reset: true
          }
        },
        background: theme === 'dark' ? '#0F172B' : '#fff',
      },
      plotOptions: {
        bar: {
          horizontal: true,
          barHeight: '70%',
        },
      },
      dataLabels: {
        enabled: true,
        formatter: function (val: number, opts: any) {
          const seriesIndex = opts.seriesIndex;
          const dataPointIndex = opts.dataPointIndex;
          
          // Hitung total untuk tahun angkatan ini
          const allSeries = opts.w.config.series;
          let totalForYear = 0;
          allSeries.forEach((series: any) => {
            totalForYear += series.data[dataPointIndex] || 0;
          });
          
          if (totalForYear === 0 || val === 0) return '0%';
          
          const percentage = ((val / totalForYear) * 100).toFixed(0);
          return percentage + '%';
        },
        style: {
          fontSize: '12px',
          colors: [theme === 'dark' ? '#fff' : '#000']
        }
      },
      stroke: {
        show: true,
        width: 2,
        colors: ['transparent']
      },
      xaxis: {
        categories: years.map(y => y.toString()),
        title: {
          text: 'Tahun Angkatan',
          style: {
            fontSize: '14px',
            fontWeight: 'bold',
            color: theme === 'dark' ? '#fff' : '#000'
          }
        },
        labels: {
          style: {
            fontSize: '12px',
            colors: theme === 'dark' ? '#fff' : '#000'
          }
        }
      },
      yaxis: {
        title: {
          text: 'Jumlah Mahasiswa',
          style: {
            fontSize: '14px',
            fontWeight: 'bold',
            color: theme === 'dark' ? '#fff' : '#000'
          }
        },
        labels: {
          style: {
            fontSize: '12px',
            colors: theme === 'dark' ? '#fff' : '#000'
          }
        },
        min: 0,
        tickAmount: 5
      },
      fill: {
        opacity: 1
      },
      colors: ['#3B82F6', '#EC4899', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#06B6D4'],
      tooltip: {
        theme: theme === 'dark' ? 'dark' : 'light',
        shared: true,
        intersect: false,
        custom: function({ series, seriesIndex, dataPointIndex, w }: any) {
          const tahun = w.globals.labels[dataPointIndex];
          const isDark = theme === 'dark';
          
          // Hitung total untuk tahun ini
          let total = 0;
          series.forEach((seriesData: number[]) => {
            total += seriesData[dataPointIndex] || 0;
          });
          
          const beasiswaNames = w.config.series.map((s: any) => s.name);
          const beasiswaColors = w.config.colors;
          
          let tooltipContent = `
            <div style="
              padding: 12px 16px; 
              background: ${isDark ? 'rgba(30, 41, 59, 0.95)' : 'rgba(255, 255, 255, 0.95)'}; 
              backdrop-filter: blur(10px);
              border: none; 
              border-radius: 12px; 
              box-shadow: 0 8px 32px ${isDark ? 'rgba(0, 0, 0, 0.3)' : 'rgba(0, 0, 0, 0.1)'};
              font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
              min-width: 180px;
            ">
              <div style="
                font-size: 13px; 
                font-weight: 600; 
                color: ${isDark ? '#f1f5f9' : '#1f2937'}; 
                margin-bottom: 8px;
                text-align: center;
              ">Angkatan ${tahun}</div>`;
          
          // Tambahkan setiap jenis beasiswa
          series.forEach((seriesData: number[], index: number) => {
            const value = seriesData[dataPointIndex] || 0;
            tooltipContent += `
              <div style="display: flex; align-items: center; margin-bottom: 4px;">
                <div style="width: 8px; height: 8px; background: ${beasiswaColors[index]}; border-radius: 50%; margin-right: 8px;"></div>
                <span style="font-size: 12px; color: ${isDark ? '#cbd5e1' : '#374151'};">${beasiswaNames[index]}</span>
                <span style="font-size: 12px; font-weight: 600; color: ${isDark ? '#f1f5f9' : '#1f2937'}; margin-left: auto;">${value}</span>
              </div>`;
          });
          
          // Tambahkan total
          tooltipContent += `
              <div style="
                border-top: 1px solid ${isDark ? '#475569' : '#e5e7eb'}; 
                margin-top: 8px; 
                padding-top: 8px;
                display: flex; 
                align-items: center;
              ">
                <div style="width: 8px; height: 8px; background: #10B981; border-radius: 50%; margin-right: 8px;"></div>
                <span style="font-size: 12px; font-weight: 600; color: ${isDark ? '#f1f5f9' : '#1f2937'};">Total</span>
                <span style="font-size: 13px; font-weight: 700; color: #10B981; margin-left: auto;">${total}</span>
              </div>
            </div>
          `;
          
          return tooltipContent;
        }
      },
      legend: {
        position: 'top',
        fontSize: '14px',
        markers: {
          size: 12,
        },
        itemMargin: {
          horizontal: 10,
        },
        labels: {
          colors: theme === 'dark' ? '#fff' : '#000'
        }
      },
      grid: {
        borderColor: theme === 'dark' ? '#374151' : '#E5E7EB',
        strokeDashArray: 4,
        padding: {
          top: 20,
          right: 0,
          bottom: 0,
          left: 0
        }
      }
    });
  };

  // Process data for series
  const processSeriesData = () => {
    if (!data.length) return [];

    const years = [...new Set(data.map(item => item.tahun_angkatan))].sort();
    const beasiswaTypes = [...new Set(data.map(item => item.nama_beasiswa))].sort();

    return beasiswaTypes.map(beasiswa => ({
      name: beasiswa,
      data: years.map(year => {
        const item = data.find(d => d.tahun_angkatan === year && d.nama_beasiswa === beasiswa);
        return item ? item.jumlah_nama_beasiswa : 0;
      })
    }));
  };

  const series = processSeriesData();

  if (loading) {
    return (
      <Card className="bg-white dark:bg-slate-900 shadow-lg">
        <CardHeader>
          <CardTitle className="text-xl font-bold dark:text-white">
            Loading...
          </CardTitle>
        </CardHeader>
      </Card>
    );
  }

  if (error) {
    return (
      <Card className="bg-white dark:bg-slate-900 shadow-lg">
        <CardHeader>
          <CardTitle className="text-xl font-bold text-red-500">
            Error: {error}
          </CardTitle>
        </CardHeader>
      </Card>
    );
  }

  if (data.length === 0) {
    return (
      <Card className="bg-white dark:bg-slate-900 shadow-lg">
        <CardHeader>
          <CardTitle className="text-xl font-bold dark:text-white">
            Tidak ada data yang tersedia
          </CardTitle>
        </CardHeader>
      </Card>
    );
  }

  return (
    <Card className="bg-white dark:bg-slate-900 shadow-lg">
      <CardHeader>
        <div className="flex justify-between items-center">
          <CardTitle className="text-xl font-bold dark:text-white">
            Persentase Jumlah Mahasiswa Berdasarkan Nama Beasiswa dan Tahun Angkatan
            {selectedYear !== 'all' ? ` Angkatan ${selectedYear}` : ''}
          </CardTitle>
          {showDetailButton && (
            <Link href="/detail/nama-beasiswa" target="_blank">
              <Button variant="outline" size="sm" className="flex items-center gap-1 dark:text-white">
                <ExternalLink className="size-3" />
                Detail
              </Button>
            </Link>
          )}
        </div>
      </CardHeader>
      <CardContent>
        <div className={`${height} w-full max-w-5xl mx-auto`}>
          {typeof window !== 'undefined' && series.length > 0 && Object.keys(chartOptions).length > 0 && (
            <Chart
              options={chartOptions}
              series={series}
              type="bar"
              height="100%"
              width="100%"
            />
          )}
        </div>
      </CardContent>
    </Card>
  );
}
