import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:fl_chart/fl_chart.dart';

import '../../../config/app_colors.dart';
import '../../../models/timeline.dart';

class ChartTimelineEclecticism extends StatelessWidget {
  final TimelineData chartData;

  const ChartTimelineEclecticism({super.key, required this.chartData});

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 100.0,
      child: LineChart(
        LineChartData(
          lineBarsData: getDataEclecticism(),
          backgroundColor: Theme.of(context).colorScheme.onBackground,
          borderData: getBorderData(),
          gridData: getGridData(),
          titlesData: getTitlesData(),
          lineTouchData: getLineTouchDataEclecticism(),
          maxY: 100,
          minY: 0,
        ),
        duration: const Duration(milliseconds: 250),
      ),
    );
  }

  List<LineChartBarData> getDataEclecticism() {
    List<FlSpot> spots = [];

    this.chartData.data.keys.forEach((element) {
      TimelineDataValue? value = this.chartData.data[element];
      if (value != null) {
        final double date = DateTime.parse(element).millisecondsSinceEpoch.toDouble();
        final double eclecticism = value.eclecticism.toDouble();

        spots.add(FlSpot(date, eclecticism));
      }
    });

    return [
      LineChartBarData(
        isCurved: true,
        color: AppColors.contentColorCyan,
        barWidth: 3,
        isStrokeCapRound: false,
        dotData: const FlDotData(show: false),
        belowBarData: BarAreaData(show: true),
        spots: spots,
      ),
    ];
  }

  FlBorderData getBorderData() {
    return FlBorderData(
      show: true,
      border: Border.all(
        color: AppColors.borderColor,
        width: 2,
      ),
    );
  }

  FlGridData getGridData() {
    return const FlGridData(
      show: true,
    );
  }

  FlTitlesData getTitlesData() {
    const AxisTitles none = const AxisTitles(
      sideTitles: SideTitles(showTitles: false),
    );

    final AxisTitles verticalTitles = AxisTitles(
      sideTitles: SideTitles(
        showTitles: true,
        reservedSize: 30,
        getTitlesWidget: getVerticalTitlesWidget,
        interval: 25,
      ),
    );
    final AxisTitles horizontalTitles = AxisTitles(
      sideTitles: SideTitles(
        showTitles: true,
        reservedSize: 20,
        getTitlesWidget: getHorizontalTitlesWidget,
      ),
    );

    return FlTitlesData(
      show: true,
      bottomTitles: horizontalTitles,
      leftTitles: none,
      topTitles: none,
      rightTitles: verticalTitles,
    );
  }

  Widget getVerticalTitlesWidget(double value, TitleMeta meta) {
    return SideTitleWidget(
      axisSide: meta.axisSide,
      space: 4,
      child: Text(
        value.toInt().toString(),
        style: const TextStyle(
          color: AppColors.mainTextColor1,
          fontSize: 12,
        ),
      ),
    );
  }

  Widget getHorizontalTitlesWidget(double value, TitleMeta meta) {
    final DateFormat formatter = DateFormat('dd/MM');

    final DateTime date = DateTime.fromMillisecondsSinceEpoch(value.toInt());
    final String text = formatter.format(date);

    return SideTitleWidget(
      axisSide: meta.axisSide,
      space: 4,
      child: RotationTransition(
        turns: new AlwaysStoppedAnimation(-30 / 360),
        child: Text(
          text,
          style: const TextStyle(
            color: AppColors.mainTextColor1,
            fontSize: 11,
          ),
        ),
      ),
    );
  }

  LineTouchData getLineTouchDataEclecticism() {
    return LineTouchData(
      handleBuiltInTouches: true,
      touchTooltipData: LineTouchTooltipData(
        tooltipBgColor: Colors.transparent,
        tooltipPadding: EdgeInsets.all(8),
        tooltipMargin: 2,
        getTooltipItems: (List<LineBarSpot> touchedSpots) {
          return touchedSpots.map((LineBarSpot touchedSpot) {
            final textStyle = TextStyle(
              color: AppColors.mainTextColor2,
              fontWeight: FontWeight.bold,
              fontSize: 10,
            );
            return LineTooltipItem(
              touchedSpot.y.toString(),
              textStyle,
            );
          }).toList();
        },
      ),
    );
  }
}