import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/weight_pressure_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/RadioStringDialog.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
import 'package:provider/provider.dart';

class AddWeightPage extends StatefulWidget {
  final WeightPressureViewModel model;
  final bool isUpdate;
  final DateTime dayWeightDate;
  final int lineItemNo;
  final String weightValue;
  final String measureTimeSelectedType;
  final int weightUnit;

  AddWeightPage(
      {Key key,
        this.model,
        this.isUpdate = false,
        this.dayWeightDate,
        this.lineItemNo,
        this.weightValue,
        this.measureTimeSelectedType,
        this.weightUnit})
      : super(key: key);

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

class _AddWeightPageState extends State<AddWeightPage> {
  TextEditingController _weightValueController = TextEditingController();
  DateTime dayWeightDate = DateTime.now();
  DateTime timeWeightDate = DateTime.now();
  int weightUnit = 1;
  final List<String> measureUnitEnList = [
    'Kg',
    'Pound',
  ];
  final List<String> measureUnitArList = ["كيلو جرام", "باوند"];
  String measureTimeSelectedType;
  bool isButtonDisabled = false;

  @override
  void initState() {
    super.initState();
    if (widget.isUpdate) {
      dayWeightDate = widget.dayWeightDate;
      timeWeightDate = widget.dayWeightDate;
      measureTimeSelectedType = widget.measureTimeSelectedType;
      if (measureUnitEnList.contains(widget.measureTimeSelectedType))
        weightUnit = measureUnitEnList.indexOf(widget.measureTimeSelectedType);
      else if (measureUnitArList.contains(widget.measureTimeSelectedType))
        weightUnit = measureUnitArList.indexOf(widget.measureTimeSelectedType);
      _weightValueController.text = widget.weightValue;
      validateForm();
    }
  }

  @override
  Widget build(BuildContext context) {
    ProjectViewModel projectViewModel = Provider.of(context);

    return AppScaffold(
      isShowAppBar: true,
      appBarTitle: widget.isUpdate
          ? TranslationBase.of(context).update
          : TranslationBase.of(context).add,
      appBarIcons: widget.isUpdate
      ? [
      IconButton(
        icon: Icon(Icons.delete),
        color: Colors.white,
        onPressed: () {
          ConfirmDialog dialog = new ConfirmDialog(
              context: context,
              confirmMessage: 'Remove this measure',
              okText: TranslationBase.of(context).ok,
              cancelText: TranslationBase.of(context).cancel,
              okFunction: () async {
                ConfirmDialog.closeAlertDialog(context);

                GifLoaderDialogUtils.showMyDialog(context);
                widget.model
                    .deleteWeightResult(lineItemNo: widget.lineItemNo)
                    .then((value) {
                  GifLoaderDialogUtils.hideDialog(context);
                  if (widget.model.state == ViewState.ErrorLocal)
                    AppToast.showErrorToast(
                        message: widget.model.error);
                  else
                    Navigator.pop(context);
                }).catchError((e) {
                  GifLoaderDialogUtils.hideDialog(context);
                  AppToast.showErrorToast(message: widget.model.error);
                });
              },
              cancelFunction: () => {});
          dialog.showAlertDialog(context);
        },
      )
      ]
          : null,
      body: SingleChildScrollView(
        physics: BouncingScrollPhysics(),
        child: Container(
          margin: EdgeInsets.all(15),
          child: Column(
            children: [
              SizedBox(
                height: 15,
              ),
              NewTextFields(
                hintText: TranslationBase.of(context).weightAdd,
                controller: _weightValueController,
                keyboardType: TextInputType.number,
                onChanged: (value) => validateForm(),
              ),
              SizedBox(
                height: 8,
              ),
              InkWell(
                onTap: () {
                  confirmSelectMeasureTimeDialog(projectViewModel.isArabic
                      ? measureUnitArList
                      : measureUnitEnList);
                },
                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,
                      )
                    ],
                  ),
                ),
              ),
              SizedBox(
                height: 8,
              ),
              InkWell(
                onTap: () {
                  DatePicker.showDatePicker(
                    context,
                    showTitleActions: true,
                    minTime: DateTime(DateTime.now().year - 1, 1, 1),
                    maxTime: DateTime.now(),
                    onConfirm: (date) {
                      setState(() {
                        dayWeightDate = date;
                      });
                    },
                    currentTime: dayWeightDate,
                    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: 8,
              ),
              InkWell(
                onTap: () {
                  DatePicker.showTimePicker(
                    context,
                    showTitleActions: true,
                    onConfirm: (date) {
                      setState(() {
                        timeWeightDate = date;
                      });
                    },
                    currentTime: timeWeightDate,
                    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())
                    ],
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
      bottomSheet: Container(
        color: Colors.transparent,
        width: double.infinity,
        height: MediaQuery.of(context).size.width * 0.2,
        child: Padding(
          padding: const EdgeInsets.all(15.0),
          child: SecondaryButton(
              loading: widget.model.state == ViewState.BusyLocal,
              label: TranslationBase.of(context).save.toUpperCase(),
              textColor: Colors.white,
              color: isButtonDisabled ? Colors.grey[900] : Colors.grey,
              onTap: () {
                if (_weightValueController.text.isNotEmpty) {
                  if (widget.isUpdate) {
                    GifLoaderDialogUtils.showMyDialog(context);
                    widget.model
                        .updateWeightResult(
                        weightDate:
                        '${dayWeightDate.year}-${dayWeightDate.month}-${dayWeightDate.day} ${timeWeightDate.hour}:${timeWeightDate.minute}:00',
                        weightMeasured:
                        _weightValueController.text.toString(),
                        weightUnit: weightUnit,
                        lineItemNo: widget.lineItemNo)
                        .then((value) {
                      GifLoaderDialogUtils.hideDialog(context);
                      if (widget.model.state == ViewState.Error)
                        AppToast.showErrorToast(message: widget.model.error);
                      else
                        Navigator.pop(context);
                    });
                  } else
                    widget.model
                        .addWeightResult(
                      weightDate:
                      '${dayWeightDate.year}-${dayWeightDate.month}-${dayWeightDate.day} ${timeWeightDate.hour}:${timeWeightDate.minute}:00',
                      weightMeasured: _weightValueController.text.toString(),
                      weightUnit: weightUnit,
                    )
                        .then((value) {
                      GifLoaderDialogUtils.hideDialog(context);
                      if (widget.model.state == ViewState.Error)
                        AppToast.showErrorToast(message: widget.model.error);
                      else
                        Navigator.pop(context);
                    });
                }
              }),
        ),
      ),
    );
  }

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

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

  void confirmSelectMeasureTimeDialog(List<String> list) {
    showDialog(
      context: context,
      child: RadioStringDialog(
        radioList: list,
        title: TranslationBase.of(context).measureUnit,
        selectedValue: measureTimeSelectedType,
        onValueSelected: (value) {
          setState(() {
            measureTimeSelectedType = value;
            weightUnit = list.indexOf(value);
            validateForm();
          });
        },
      ),
    );
  }

  void validateForm() {
    if (_weightValueController.text.length > 0 &&
        measureTimeSelectedType != null) {
      setState(() {
        isButtonDisabled = true;
      });
    } else {
      setState(() {
        isButtonDisabled = false;
      });
    }
  }
}
