import 'package:flutter/material.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:scrobbles/models/data/topartists.dart';
import 'package:scrobbles/ui/widgets/abstracts/custom_chart.dart';

class ChartTopArtists extends CustomChart {
  const ChartTopArtists({super.key, required this.chartData});

  final TopArtistsData chartData;

  @override
  Widget build(BuildContext context) {
    return AspectRatio(
      aspectRatio: 2.1,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          Expanded(
            child: AspectRatio(
              aspectRatio: 1,
              child: PieChart(
                PieChartData(
                  sections: getPieChartData(),
                  sectionsSpace: 2,
                  centerSpaceRadius: 40,
                  startDegreeOffset: -45,
                  pieTouchData: PieTouchData(enabled: false),
                  borderData: FlBorderData(show: false),
                ),
              ),
            ),
          ),
          buildLegendWidget(),
        ],
      ),
    );
  }

  List<PieChartSectionData> getPieChartData() {
    List<PieChartSectionData> items = [];

    const radius = 40.0;
    const fontSize = 11.0;
    const shadows = [
      Shadow(
        color: Colors.black,
        blurRadius: 2,
      )
    ];

    int index = 0;

    for (var element in chartData.topArtists) {
      final Color baseColor = getColorFromIndex(index++);

      final PieChartSectionData item = PieChartSectionData(
        value: element.count.toDouble(),
        title: element.artistName,
        color: baseColor.darken(20),
        borderSide: BorderSide(
          color: baseColor.darken(40),
          width: 1,
        ),
        radius: radius,
        titleStyle: const TextStyle(
          fontSize: fontSize,
          shadows: shadows,
        ),
      );

      items.add(item);
    }

    return items;
  }

  Widget buildLegendWidget() {
    const double itemSize = 12;

    List<Widget> items = [];
    int index = 0;

    for (var element in chartData.topArtists) {
      final Color baseColor = getColorFromIndex(index++);

      final Widget item = Row(
        children: <Widget>[
          Container(
            width: itemSize,
            height: itemSize,
            decoration: BoxDecoration(
              shape: BoxShape.rectangle,
              color: baseColor.darken(20),
              border: Border.all(
                color: baseColor.darken(40),
                width: 1,
              ),
            ),
          ),
          const SizedBox(width: 4),
          Text(
            '${element.artistName} (${element.count})',
            style: const TextStyle(
              fontSize: itemSize - 2,
              fontWeight: FontWeight.bold,
            ),
          )
        ],
      );

      items.add(item);
    }

    return Column(
      mainAxisAlignment: MainAxisAlignment.start,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: items,
    );
  }
}