import 'package:hmg_patient_app/core/enum/viewstate.dart';
import 'package:hmg_patient_app/core/viewModels/medical/blood_sugar_view_model.dart';
import 'package:hmg_patient_app/core/viewModels/project_view_model.dart';
import 'package:hmg_patient_app/pages/medical/balance/new_text_Field.dart';
import 'package:hmg_patient_app/uitl/app_toast.dart';
import 'package:hmg_patient_app/uitl/date_uitl.dart';
import 'package:hmg_patient_app/uitl/gif_loader_dialog_utils.dart';
import 'package:hmg_patient_app/uitl/translations_delegate_base.dart';
import 'package:hmg_patient_app/widgets/buttons/defaultButton.dart';
import 'package:hmg_patient_app/widgets/data_display/text.dart';
import 'package:hmg_patient_app/widgets/dialogs/ConfirmWithMessageDialog.dart';
import 'package:hmg_patient_app/widgets/dialogs/radio_selection_dialog.dart';
import 'package:hmg_patient_app/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_datetime_picker_plus/flutter_datetime_picker_plus.dart';
import 'package:provider/provider.dart';

class AddBloodSugarPage extends StatefulWidget {
  final DateTime? bloodSugarDate;
  final String? measureUnitSelectedType;
  final bool? isUpdate;
  final String? measuredTime;
  final String? bloodSugarValue;
  final int? lineItemNo;
  final String? measuredSelectedType;
  final BloodSugarViewMode? bloodSugarViewMode;

  AddBloodSugarPage(
      {Key? key, this.bloodSugarDate, this.measureUnitSelectedType, this.isUpdate = false, this.measuredTime, this.bloodSugarValue, this.lineItemNo, this.bloodSugarViewMode, this.measuredSelectedType})
      : super(key: key);

  @override
  _AddBloodSugarPageState createState() => _AddBloodSugarPageState();
}

class _AddBloodSugarPageState extends State<AddBloodSugarPage> {
  TextEditingController _bloodSugarValueController = TextEditingController();
  DateTime bloodSugarDate = DateTime.now();
  DateTime timeSugarDate = DateTime.now();
  String measureUnitSelectedType = 'mg/dlt';
  int measuredTime = 9;
  bool isButtonDisabled = true;

  int _selectedMeasureUnitIndex = 0;
  final List<String> measureUnitList = ['mg/dlt', 'mol/L'];
  final List<String> measureTimeEnList = [
    'Before Breakfast',
    'After Breakfast',
    'Before Lunch',
    'After Lunch',
    'Before Dinner',
    'After Dinner',
    'Before Sleep',
    'After Sleep',
    'Fasting',
    'Other',
  ];
  final List<String> measureTimeArList = [
    "قبل الإفطار",
    "بعد الإفطار",
    "قبل الغداء",
    "بعد الغداء",
    "قبل العشاء",
    "بعد العشاء",
    "قبل النوم",
    "بعد النوم",
    "صائم",
    "آخر",
  ];
  int? _selectedMeasureTimeIndex =9;
  String? measureTimeSelectedType;

  @override
  void initState() {
    super.initState();
    if (widget.isUpdate!) {
      bloodSugarDate = widget.bloodSugarDate!;
      timeSugarDate = widget.bloodSugarDate!;
      measureUnitSelectedType = widget.measureUnitSelectedType!;
      if (measureTimeEnList.contains(widget.measuredTime))
        measuredTime = measureTimeEnList.indexOf(widget.measuredTime!);
      else if (measureTimeArList.contains(widget.measuredTime)) measuredTime = measureTimeArList.indexOf(widget.measuredTime!);
      _bloodSugarValueController.text = widget.bloodSugarValue!;
      measureTimeSelectedType = widget.measuredSelectedType;
      validateForm();
    }
  }

  @override
  Widget build(BuildContext context) {
    ProjectViewModel projectViewModel = Provider.of(context);
    return AppScaffold(
      isShowAppBar: true,
      showNewAppBar: true,
      showNewAppBarTitle: true,
      appBarTitle: widget.isUpdate! ? TranslationBase.of(context).update : TranslationBase.of(context).add,
      body: Column(
        children: [
          Expanded(
            child: SingleChildScrollView(
              physics: BouncingScrollPhysics(),
              padding: EdgeInsets.all(21),
              child: Column(
                children: [
                  NewTextFields(
                    hintText: TranslationBase.of(context).sugarAdd,
                    controller: _bloodSugarValueController,
                    keyboardType: TextInputType.number,
                    onChanged: (value) => validateForm(),
                    fontWeight: FontWeight.normal,
                    fontSize: 14,
                  ),
                  SizedBox(height: 12),
                  InkWell(
                    onTap: () {
                      confirmSelectMeasureUnitDialog();
                    },
                    child: Container(
                      padding: EdgeInsets.all(12),
                      width: double.infinity,
                      height: 65,
                      decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), color: Colors.white),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: [
                          Texts(measureUnitSelectedType),
                          Icon(
                            Icons.arrow_drop_down,
                            color: Colors.grey,
                          )
                        ],
                      ),
                    ),
                  ),
                  SizedBox(height: 12),
                  InkWell(
                    onTap: () {
                      DatePicker.showDatePicker(context, showTitleActions: true, minTime: DateTime(DateTime.now().year - 1, 1, 1), maxTime: DateTime.now(), onConfirm: (date) {
                        setState(() {
                          bloodSugarDate = date;
                        });
                      }, currentTime: bloodSugarDate, locale: projectViewModel.localeType);
                    },
                    child: Container(
                      padding: EdgeInsets.all(12),
                      width: double.infinity,
                      height: 65,
                      decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), color: Colors.white),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: [
                          Texts(TranslationBase.of(context).date),
                          Texts(getDate()),
                        ],
                      ),
                    ),
                  ),
                  SizedBox(height: 12),
                  InkWell(
                    onTap: () {
                      DatePicker.showTimePicker(context, showTitleActions: true, onConfirm: (date) {
                        setState(() {
                          timeSugarDate = date;
                        });
                      }, currentTime: timeSugarDate, locale: projectViewModel.localeType);
                    },
                    child: Container(
                      padding: EdgeInsets.all(12),
                      width: double.infinity,
                      height: 65,
                      decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), color: Colors.white),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: [Texts(TranslationBase.of(context).time), Texts(getTime())],
                      ),
                    ),
                  ),
                  SizedBox(height: 12),
                  InkWell(
                    onTap: () {
                      confirmSelectMeasureTimeDialog(projectViewModel.isArabic ? measureTimeArList : measureTimeEnList);
                    },
                    child: Container(
                      padding: EdgeInsets.all(12),
                      width: double.infinity,
                      height: 65,
                      decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), color: Colors.white),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: [
                          Texts(measureTimeSelectedType ?? TranslationBase.of(context).other),
                          Icon(
                            Icons.arrow_drop_down,
                            color: Colors.grey,
                          )
                        ],
                      ),
                    ),
                  ),
                  widget.isUpdate!
                      ? Container(
                          padding: EdgeInsets.all(10),
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.end,
                            children: [
                              InkWell(
                                child: Texts(
                                  TranslationBase.of(context).delete,
                                  decoration: TextDecoration.underline,
                                  fontWeight: FontWeight.bold,
                                  color: Colors.red[900],
                                ),
                                onTap: () {
                                  showDialog(
                                    context: context,
                                    builder: (cxt) => ConfirmWithMessageDialog(
                                      message: TranslationBase.of(context).removeMeasure,
                                      onTap: () async {
                                        GifLoaderDialogUtils.showMyDialog(context);
                                        widget.bloodSugarViewMode!.deactivateDiabeticStatus(lineItemNo: widget.lineItemNo!).then((value) {
                                          GifLoaderDialogUtils.hideDialog(context);
                                          if (widget.bloodSugarViewMode!.state == ViewState.ErrorLocal)
                                            AppToast.showErrorToast(message: widget.bloodSugarViewMode!.error);
                                          else
                                            Navigator.pop(context);
                                        }).catchError((e) {
                                          GifLoaderDialogUtils.hideDialog(context);
                                          AppToast.showErrorToast(message: widget.bloodSugarViewMode!.error);
                                        });
                                      },
                                    ),
                                  );
                                },
                              )
                            ],
                          ),
                        )
                      : Container()
                ],
              ),
            ),
          ),
          DefaultButton(
            TranslationBase.of(context).save,
            isButtonDisabled
                ? null
                : () async {
                    if (_bloodSugarValueController.text.isNotEmpty) {
                      GifLoaderDialogUtils.showMyDialog(context);
                      if (widget.isUpdate!) {
                        await widget.bloodSugarViewMode!.updateDiabtecResult(
                            month: bloodSugarDate,
                            hour: timeSugarDate,
                            diabtecUnit: measureUnitSelectedType,
                            measuredTime: measuredTime,
                            lineItemNo: widget.lineItemNo,
                            bloodSugerResult: _bloodSugarValueController.text.toString());

                        GifLoaderDialogUtils.hideDialog(context);
                        if (widget.bloodSugarViewMode!.state == ViewState.ErrorLocal)
                          AppToast.showErrorToast(message: widget.bloodSugarViewMode!.error);
                        else
                          Navigator.pop(context);
                      } else {
                        await widget.bloodSugarViewMode!.addDiabtecResult(
                          diabtecUnit: measureUnitSelectedType,
                          measuredTime: measuredTime,
                          bloodSugerResult: _bloodSugarValueController.text.toString(),
                          bloodSugerDateChart: '${bloodSugarDate.year}-${bloodSugarDate.month}-${bloodSugarDate.day} ${timeSugarDate.hour}:${timeSugarDate.minute}:00',
                        );

                        GifLoaderDialogUtils.hideDialog(context);
                        if (widget.bloodSugarViewMode!.state == ViewState.Error)
                          AppToast.showErrorToast(message: widget.bloodSugarViewMode!.error);
                        else
                          Navigator.pop(context);
                      }
                    }
                  },
            disabledColor: Colors.grey,
          ).insideContainer,
        ],
      ),
    );
  }

  String getDate() {
    return "${DateUtil.getMonth(bloodSugarDate.month)} ${bloodSugarDate.day}, ${bloodSugarDate.year}";
  }

  String getTime() {
    return " ${timeSugarDate.hour}:${timeSugarDate.minute}";
  }

  void confirmSelectMeasureUnitDialog() {
    List<RadioSelectionDialogModel> list = [
      RadioSelectionDialogModel("mg/dlt", 0),
      RadioSelectionDialogModel("mol/L", 1),
    ];

    showDialog(
      context: context,
      builder: (cxt) => RadioSelectionDialog(
        listData: list,
        selectedIndex: _selectedMeasureUnitIndex,
        onValueSelected: (index) {
          _selectedMeasureUnitIndex = index;
          measureUnitSelectedType = list[index].title;
          setState(() {});
        },
      ),
    );
  }

  void confirmSelectMeasureTimeDialog(List<String> dataList) {
    List<RadioSelectionDialogModel> list = [
      for (int i = 0; i < dataList.length; i++) RadioSelectionDialogModel(dataList[i], i),
    ];

    showDialog(
      context: context,
      builder: (cxt) => RadioSelectionDialog(
        listData: list,
        selectedIndex: _selectedMeasureTimeIndex,
        isScrollable: true,
        onValueSelected: (index) {
          _selectedMeasureTimeIndex = index;
          measureTimeSelectedType = list[index].title;
          measuredTime = index;
          setState(() {});
        },
      ),
    );
  }

  void validateForm() {
    if (_bloodSugarValueController.text.length > 0) {
      setState(() {
        isButtonDisabled = false;
      });
    } else {
      setState(() {
        isButtonDisabled = true;
      });
    }
  }
}
