import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/model/charts/app_time_series_chart.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';

class LineChartForDiabetic extends StatelessWidget {
  final String? title;
  final List<TimeSeriesSales2>? timeSeries1;
  final int? indexes;
  final bool isOX;

  LineChartForDiabetic({this.title, this.timeSeries1, this.indexes, this.isOX = false});

  List<int> xAxixs = [];
  List<double> yAxixs = [];

  @override
  Widget build(BuildContext context) {
    getXaxix();
    return AspectRatio(
      aspectRatio: 1.1,
      child: Container(
        decoration: const BoxDecoration(
          borderRadius: BorderRadius.all(Radius.circular(18)),
          // color: Colors.white,
        ),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            const SizedBox(
              height: 4,
            ),
            Container(
              padding: const EdgeInsets.only(right: 18.0, left: 16.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  AppText(
                    title!,
                    fontSize: SizeConfig.textMultiplier! * 2.1,
                    fontWeight: FontWeight.bold,
                    fontFamily: 'Poppins',
                    textAlign: TextAlign.center,
                  ),
                ],
              ),
            ),
            SizedBox(
              height: 10,
            ),
            Expanded(
              child: Padding(
                padding: const EdgeInsets.only(right: 18.0, left: 16.0, top: 15),
                child: LineChart(
                  sampleData1(context),
                  duration: const Duration(milliseconds: 250),
                ),
              ),
            ),
            SizedBox(
              height: 10,
            ),
          ],
        ),
      ),
    );
  }

  getXaxix() {
    for (int index = 0; index < timeSeries1!.length; index++) {
      int mIndex = indexes! * index;
      if (mIndex < timeSeries1!.length) {
        xAxixs.add(mIndex);
      }
    }
  }

  LineChartData sampleData1(context) {
    return LineChartData(
      lineTouchData: LineTouchData(
        touchTooltipData: LineTouchTooltipData(
          tooltipBgColor: Colors.white,
        ),
        touchCallback: (FlTouchEvent event, LineTouchResponse? touchResponse) {},
        handleBuiltInTouches: true,
      ),
      gridData: FlGridData(show: true, drawVerticalLine: true, drawHorizontalLine: true),
      titlesData: FlTitlesData(
        bottomTitles: AxisTitles(
            sideTitles: SideTitles(
          showTitles: true,
          getTitlesWidget: (value, meta) {
            if (timeSeries1!.length < 15) {
              if (timeSeries1!.length > value.toInt()) {
                return Text(
                  '${timeSeries1![value.toInt()].time.month}/ ${timeSeries1![value.toInt()].time.year}',
                  style: TextStyle(
                    color: Colors.black,
                    fontSize: 10,
                  ),
                );
              } else
                return Text("");
            } else {
              if (value.toInt() == 0)
                return Text(
                  '${timeSeries1![value.toInt()].time.month}/ ${timeSeries1![value.toInt()].time.year}',
                  style: TextStyle(
                    color: Colors.black,
                    fontSize: 10,
                  ),
                );
              if (value.toInt() == timeSeries1!.length - 1)
                return Text(
                  '${timeSeries1![value.toInt()].time.month}/ ${timeSeries1![value.toInt()].time.year}',
                  style: TextStyle(
                    color: Colors.black,
                    fontSize: 10,
                  ),
                );
              if (xAxixs.contains(value.toInt())) {
                return Text(
                  '${timeSeries1![value.toInt()].time.month}/ ${timeSeries1![value.toInt()].time.year}',
                  style: TextStyle(
                    color: Colors.black,
                    fontSize: 10,
                  ),
                );
              }
            }
            return Text(
              "",
              style: TextStyle(
                color: Colors.black,
                fontSize: 10,
              ),
            );
          },
          //  rotateAngle: -65,
          //rotateAngle:-65,
          interval: 100,
          reservedSize: 22,
          // getTitles: (value) {
          //
          // },
        )),
        leftTitles: AxisTitles(
            sideTitles: SideTitles(
          showTitles: true,
          //  getTextStyles:
          getTitlesWidget: (val, MetaVal) {
            return Text(
              "",
              style: TextStyle(
                color: Colors.black,
                fontSize: 10,
              ),
            );
          },
          interval: getMaxY() - getMinY() <= 500
              ? 50
              : getMaxY() - getMinY() <= 1000
                  ? 100
                  : 200,
          reservedSize: 12,
        )),
      ),
      borderData: FlBorderData(
        show: true,
        border: const Border(
          bottom: BorderSide(
            color: Colors.black,
            width: 0.5,
          ),
          left: BorderSide(
            color: Colors.black,
          ),
          right: BorderSide(
            color: Colors.black,
          ),
          top: BorderSide(
            color: Colors.transparent,
          ),
        ),
      ),
      minX: 0,
      maxX: (timeSeries1!.length - 1).toDouble(),
      maxY: getMaxY() + 0.3,
      minY: getMinY(),
      lineBarsData: getData(context),
    );
  }

  double getMaxY() {
    double max = 0;
    timeSeries1!.forEach((element) {
      double resultValueDouble = element.sales!;
      if (resultValueDouble > max) max = resultValueDouble;
    });
    // timeSeries2.forEach((element) {
    //   double resultValueDouble = element.sales;
    //   if (resultValueDouble > max) max = resultValueDouble;
    // });

    return max.roundToDouble();
  }

  double getMinY() {
    double min = timeSeries1![0].sales!;
    timeSeries1!.forEach((element) {
      double resultValueDouble = element.sales!;
      if (resultValueDouble < min) min = resultValueDouble;
    });
    // timeSeries2.forEach((element) {
    //   double resultValueDouble = element.sales;
    //   if (resultValueDouble < min) min = resultValueDouble;
    // });

    int value = min.toInt();

    return value.toDouble();
  }

  List<LineChartBarData> getData(context) {
    List<FlSpot> spots = [];
    for (int index = 0; index < timeSeries1!.length; index++) {
      spots.add(FlSpot(index.toDouble(), timeSeries1![index].sales!));
    }

    List<FlSpot> spots2 = [];
    // for (int index = 0; index < timeSeries2.length; index++) {
    //   spots2.add(FlSpot(index.toDouble(), timeSeries2[index].sales));
    // }

    final LineChartBarData lineChartBarData1 = LineChartBarData(
      spots: spots,
      isCurved: false,
      color: Colors.red,
      barWidth: 5,
      isStrokeCapRound: true,
      dotData: FlDotData(
        show: false,
      ),
      belowBarData: BarAreaData(
        show: false,
      ),
    );
    final LineChartBarData lineChartBarData2 = LineChartBarData(
      spots: spots2,
      isCurved: true,
      color: Colors.red,
      barWidth: 5,
      isStrokeCapRound: true,
      dotData: FlDotData(
        show: false,
      ),
      belowBarData: BarAreaData(
        show: false,
      ),
    );

    List<LineChartBarData> lineChartData = [];
    if (spots.isNotEmpty) {
      lineChartData.add(lineChartBarData1);
    }
    if (spots2.isNotEmpty) {
      lineChartData.add(lineChartBarData2);
    }
    return lineChartData;
  }
}
