import 'dart:math';

import 'package:dartz/dartz.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/core/app_assets.dart';
import 'package:hmg_patient_app_new/core/common_models/data_points.dart';
import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/lab/history/lab_history_viewmodel.dart';
import 'package:hmg_patient_app_new/features/lab/lab_range_view_model.dart' show LabRangeViewModel;
import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart';
import 'package:hmg_patient_app_new/features/lab/models/resp_models/lab_result.dart';
import 'package:hmg_patient_app_new/presentation/lab/collapsing_list_view.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_results/lab_result_calender.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_results/lab_result_list_item.dart';
import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors;
import 'package:hmg_patient_app_new/widgets/graph/custom_graph.dart';
import 'package:provider/provider.dart' show Consumer, Provider;

import '../../../widgets/common_bottom_sheet.dart'
    show showCommonBottomSheetWithoutHeight;
import '../../book_appointment/widgets/appointment_calendar.dart'
    show AppointmentCalendar;

class LabResultDetails extends StatelessWidget {
  final LabResult recentLabResult;

  // final List<DataPoint> graphPoint;
  late LabViewModel model;

  LabResultDetails({super.key, required this.recentLabResult});

  @override
  Widget build(BuildContext context) {
    model = Provider.of<LabViewModel>(context, listen: false);
    return CollapsingListView(
      title: 'Lab Result Details'.needTranslation,
      child: SingleChildScrollView(
        child: Column(
          spacing: 16.h,
          children: [LabNameAndStatus, LabGraph(context)],
        ).paddingAll(24.h),
      ),
    );
  }

  Widget get LabNameAndStatus => Container(
      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
        color: AppColors.whiteColor,
        borderRadius: 24.h,
        hasShadow: true,
      ),
      padding: EdgeInsets.all(16.h),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        spacing: 8.h,
        children: [
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                recentLabResult.testCode ?? "",
                style: TextStyle(
                    fontSize: 32,
                    fontFamily: 'Poppins',
                    fontWeight: FontWeight.w600,
                    color: AppColors.textColor,
                    letterSpacing: -2),
              ),
              Text(
                "Result of ${recentLabResult.verifiedOn ?? ""}".needTranslation,
                style: TextStyle(
                  fontSize: 12,
                  fontFamily: 'Poppins',
                  fontWeight: FontWeight.w500,
                  color: AppColors.greyTextColor,
                ),
              ),
            ],
          ),
          //todo change the text color according to the provided test values
          Row(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Expanded(
                child: Row(
                  spacing: 4.h,

                  children: [
                    Flexible(
                      child: Text(
                        recentLabResult.resultValue ?? "",
                        style: TextStyle(
                          fontSize: 24.fSize,
                          fontWeight: FontWeight.w600,
                          fontFamily: 'Poppins',
                          color: model.getColor(
                            recentLabResult.calculatedResultFlag ?? "",
                          ),
                          letterSpacing: -2,
                        ),
                        overflow: TextOverflow.ellipsis, // prevent overflow
                        maxLines: 1,
                        softWrap: false,
                      ),
                    ),
                    Visibility(
                      visible: recentLabResult.referanceRange != null,
                      child: Text(
                        "(Reference range ${recentLabResult.referanceRange})".needTranslation,
                        style: TextStyle(
                          fontSize: 12.fSize,
                          fontWeight: FontWeight.w500,
                          fontFamily: 'Poppins',
                          color: AppColors.greyTextColor,
                        ),
                        overflow: TextOverflow.ellipsis,
                        maxLines: 1,
                        softWrap: false,
                      ),
                    ),
                  ],
                ),
              ),
              Utils.buildSvgWithAssets(
                icon: AppAssets.lab_result_indicator,
                width: 21,
                height: 23,
                iconColor: model.getColor(
                  recentLabResult.calculatedResultFlag ?? "",
                ),
              ),
            ],
          )

        ],
      ));

  Widget LabGraph(BuildContext context) => Consumer<LabRangeViewModel>(
      builder: (_, model, ___) => Consumer<LabViewModel>(
            builder: (_, labmodel, ___) => Container(
                decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
                  color: AppColors.whiteColor,
                  borderRadius: 24.h,
                  hasShadow: true,
                ),
                height: 260.h,
                padding: EdgeInsets.all(16.h),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: [
                    //title and filter icon
                    Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: [
                        Text(
                          model.isGraphVisible?"History FlowChart".needTranslation: "History".needTranslation,
                          style: TextStyle(
                            fontSize: 16,
                            fontFamily: 'Poppins',

                            fontWeight: FontWeight.w600,
                            color: AppColors.textColor,
                          ),
                        ),
                        Row(
                          spacing: 16.h,
                          children: [
                            //todo handle when the graph icon is being displayed
                            Utils.buildSvgWithAssets(
                                    icon: model.isGraphVisible?AppAssets.ic_list:AppAssets.ic_graph,
                                    width: 24,
                                    height: 24)
                                .onPress(() {
                                  model.alterGraphVisibility();
                            }),
                            Utils.buildSvgWithAssets(
                                    icon: AppAssets.ic_date_filter,
                                    width: 24,
                                    height: 24)
                                .onPress(() {
                              showCommonBottomSheetWithoutHeight(
                                title: "Set The Date Range".needTranslation,
                                context,
                                child: LabResultCalender(
                                  onRangeSelected: (start, end) {

                                    // if (start != null) {
                                      labmodel.getSelectedDateRange(start, end);
                                    // }
                                  },
                                ),
                                isFullScreen: false,
                                isCloseButtonVisible: true,
                                callBackFunc: () {},
                              );
                            }),
                          ],
                        )
                      ],
                    ).paddingOnly(bottom: model.isGraphVisible? 16.h :24.h),
                    historyBody(model, labmodel)
                  ],
                )),
          ));

  Widget leftLabels(String value) {
    return Text(
      value,
      style: TextStyle(
        fontWeight: FontWeight.w600,
        fontFamily: 'Poppins',
        fontSize: 8.fSize,
        color: AppColors.textColor,
      ),
    );
  }

  Widget buildBottomLabel(String label) {
    return Padding(
      padding: const EdgeInsets.only(top:8.0),
      child: Text(
        label,
        style: TextStyle(
            fontSize: 8.fSize,
            fontFamily: 'Poppins',
            fontWeight: FontWeight.w600,
            color: AppColors.labelTextColor),
      ),
    );
  }

  Widget historyBody(LabRangeViewModel model, LabViewModel labmodel) {
    if(model.isGraphVisible){
      var graphColor = labmodel.getColor(recentLabResult.calculatedResultFlag??"N");
      return CustomGraph(
          dataPoints: labmodel.filteredGraphValues,
          // maxY: 100,
          makeGraphBasedOnActualValue: true,
          leftLabelReservedSize: 40,
          leftLabelInterval: getInterval(labmodel),
          maxY: (labmodel.maxY)+(getInterval(labmodel)??0)/2,

          leftLabelFormatter: (value) {
            return leftLabels(value.toStringAsFixed(2).tr());
            // switch (value.toInt()) {
            //   case 10:
            //     return leftLabels("Critical Low".needTranslation);
            //   case 30:
            //     return leftLabels("Low".needTranslation);
            //   case 50:
            //     return leftLabels("Normal".needTranslation);
            //   case 70:
            //     return leftLabels("High".needTranslation);
            //   case 90:
            //     return leftLabels(
            //         "Critical High".needTranslation);
            //   default:
            //     return SizedBox.shrink();
            // }
          },
          graphColor:graphColor ,
          graphShadowColor: graphColor.withOpacity(.4),
          graphGridColor: graphColor.withOpacity(.4),
          bottomLabelFormatter: (value, data) {
            if(data.isEmpty) return SizedBox.shrink();
            if (value == 0) {
              return buildBottomLabel(data[value.toInt()].label);
            }
            if (value == data.length - 1) {
              return buildBottomLabel(data[value.toInt()].label);
            }
            if (value == ((data.length - 1) / 2)) {
              return buildBottomLabel(data[value.toInt()].label);
            }
            return SizedBox.shrink();
          },
          minX:(labmodel.filteredGraphValues.length == 1)?null : -.2,
          scrollDirection: Axis.horizontal,
          height: 180.h);
    }else {
      return labHistoryList(model, labmodel);
    }
  }

  Widget labHistoryList(LabRangeViewModel model, LabViewModel labmodel) {
    return SizedBox(
      height: 180.h,
      child: ListView.separated(
        padding: EdgeInsets.zero,
          itemCount: labmodel.filteredGraphValues.length,itemBuilder: (context, index){
        var data = labmodel.filteredGraphValues.reversed.toList()[index];
          return LabHistoryItem(
            dayNameAndDate: labmodel.getFormattedDate(data.time),
            result: data.actualValue,
            assetUrl: labmodel.getAssetUrlWRTResult(data.referenceValue),
            shouldRotateIcon: labmodel.getRotationWRTResult(data.referenceValue),
          );
        },
        separatorBuilder: (_, __) => Divider(
          color: AppColors.spacerLineColor,
          thickness: 1.h,
        ).paddingOnly(top: 4.h, bottom: 4.h),
      ),
    );
  }

  double? getInterval(LabViewModel labmodel) {
    var maxX = labmodel.maxY;
    if(maxX >1 && maxX < 5) return 1;
    if(maxX >5 && maxX < 10) return 5;
    if(maxX >10 && maxX < 50) return 10;
    if(maxX >50 && maxX < 100) return 20;
    if(maxX >100 && maxX < 200) return 30;
    return 50;
  }
}
