import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart';
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/medical/balance/dialogs/SelectHospitalDialog.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

import '../../../core/model/my_balance/AdvanceModel.dart';
import 'confirm_payment_page.dart';
import 'dialogs/SelectBeneficiaryDialog.dart';
import 'dialogs/SelectPatientFamilyDialog.dart';
import 'dialogs/SelectPatientInfoDialog.dart';
import 'new_text_Field.dart';

enum BeneficiaryType { MyAccount, MyFamilyFiles, OtherAccount, NON }

class AdvancePaymentPage extends StatefulWidget {
  @override
  _AdvancePaymentPageState createState() => _AdvancePaymentPageState();
}

class _AdvancePaymentPageState extends State<AdvancePaymentPage> {
  TextEditingController _fileTextController = TextEditingController();
  TextEditingController _notesTextController = TextEditingController();
  BeneficiaryType beneficiaryType = BeneficiaryType.NON;
  HospitalsModel _selectedHospital;
  String amount = "";
  String email;
  PatientInfo _selectedPatientInfo;
  AuthenticatedUser authenticatedUser;
  GetAllSharedRecordsByStatusList selectedPatientFamily;
  AdvanceModel advanceModel = AdvanceModel();

  AppSharedPreferences sharedPref = AppSharedPreferences();
  AuthenticatedUser authUser;

  List<ImagesInfo> imagesInfo = List();

  @override
  void initState() {
    super.initState();
    getAuthUser();
    imagesInfo.add(ImagesInfo(
        imageEn:
            'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/en/0.png',
        imageAr:
            'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/ar/0.png'));
  }

  @override
  Widget build(BuildContext context) {
    return BaseView<MyBalanceViewModel>(
      onModelReady: (model) => model.getHospitals(),
      builder: (_, model, w) => AppScaffold(
          isShowAppBar: true,
          imagesInfo: imagesInfo,
          appBarTitle: TranslationBase.of(context).advancePayment,
          description: TranslationBase.of(context).infoAdvancePayment,
          isBottomBar: model.isLogin ? true : false,
          body: SingleChildScrollView(
            physics: ScrollPhysics(),
            child: Container(
              margin: EdgeInsets.all(12),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Texts(
                    TranslationBase.of(context).advancePaymentLabel,
                    textAlign: TextAlign.center,
                  ),
                  SizedBox(
                    height: 12,
                  ),
                  InkWell(
                    onTap: () => confirmSelectBeneficiaryDialog(model),
                    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(getBeneficiaryType()),
                          Icon(Icons.arrow_drop_down)
                        ],
                      ),
                    ),
                  ),
                  if (beneficiaryType == BeneficiaryType.MyFamilyFiles)
                    SizedBox(
                      height: 12,
                    ),
                  if (beneficiaryType == BeneficiaryType.MyFamilyFiles)
                    InkWell(
                      onTap: () {
                        GifLoaderDialogUtils.showMyDialog(context);
                        model.getFamilyFiles().then((value) {
                          GifLoaderDialogUtils.hideDialog(context);
                          confirmSelectFamilyDialog(model
                              .getAllSharedRecordsByStatusResponse
                              .getAllSharedRecordsByStatusList);
                        });
                      },
                      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(getFamilyMembersName()),
                            Icon(Icons.arrow_drop_down)
                          ],
                        ),
                      ),
                    ),
                  SizedBox(
                    height: 12,
                  ),
                  NewTextFields(
                    hintText: TranslationBase.of(context).fileNumber,
                    controller: _fileTextController,
                  ),
                  if (beneficiaryType == BeneficiaryType.OtherAccount)
                    SizedBox(
                      height: 12,
                    ),
                  if (beneficiaryType == BeneficiaryType.OtherAccount)
                    InkWell(
                      onTap: () {
                        if (_fileTextController.text.isNotEmpty) {
                          GifLoaderDialogUtils.showMyDialog(context);
                          model
                              .getPatientInfoByPatientID(
                                  id: _fileTextController.text)
                              .then((value) {
                            GifLoaderDialogUtils.hideDialog(context);
                            confirmSelectPatientDialog(model.patientInfoList);
                          });
                        } else
                          AppToast.showErrorToast(
                              message: 'Please Enter The File Number');
                      },
                      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(getPatientName()),
                            Icon(Icons.arrow_drop_down)
                          ],
                        ),
                      ),
                    ),
                  SizedBox(
                    height: 12,
                  ),
                  InkWell(
                    onTap: () => confirmSelectHospitalDialog(model.hospitals),
                    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(getHospitalName()),
                          Icon(Icons.arrow_drop_down)
                        ],
                      ),
                    ),
                  ),
                  SizedBox(
                    height: 12,
                  ),
                  NewTextFields(
                    hintText: TranslationBase.of(context).amount,
                    keyboardType: TextInputType.number,
                    onChanged: (value) {
                      setState(() {
                        amount = value;
                      });
                    },
                  ),
                  SizedBox(
                    height: 12,
                  ),
                  if (model.user != null)
                    NewTextFields(
                      hintText: TranslationBase.of(context).depositorEmail,
                      initialValue: model.user.emailAddress,
                      onChanged: (value) {
                        email = value;
                      },
                    ),
                  SizedBox(
                    height: 12,
                  ),
                  NewTextFields(
                    hintText: TranslationBase.of(context).notes,
                    controller: _notesTextController,
                  ),
                  SizedBox(
                    height: MediaQuery.of(context).size.height * 0.15,
                  )
                ],
              ),
            ),
          ),
          bottomSheet: Container(
            height: 90,
            width: double.infinity,
            padding: EdgeInsets.all(18),
            child: SecondaryButton(
              textColor: Colors.white,
              label: TranslationBase.of(context).submit,
              disabled: amount.isEmpty ||
                  _fileTextController.text.isEmpty ||
                  _selectedHospital == null,
              onTap: () {
                var mobileNum;
                var patientName;

                if (beneficiaryType == BeneficiaryType.MyFamilyFiles) {
                  mobileNum = selectedPatientFamily.mobileNumber;
                  patientName = selectedPatientFamily.patientName;
                }

                if (beneficiaryType == BeneficiaryType.MyAccount) {
                  mobileNum = model.user.mobileNumber;
                  patientName = model.user.firstName;
                }

                if (beneficiaryType == BeneficiaryType.OtherAccount) {
                  mobileNum = _selectedPatientInfo.mobileNumber;
                  patientName = _selectedPatientInfo.fullName;
                }

                advanceModel.fileNumber = _fileTextController.text;
                advanceModel.hospitalsModel = _selectedHospital;
                advanceModel.note = _notesTextController.text;
                advanceModel.email = email ?? model.user.emailAddress;
                advanceModel.amount = amount;
                advanceModel.mobileNumber = mobileNum;
                advanceModel.patientName = patientName;
                GifLoaderDialogUtils.showMyDialog(context);
                model
                    .getPatientInfoByPatientIDAndMobileNumber(advanceModel)
                    .then((value) {
                  GifLoaderDialogUtils.hideDialog(context);
                  if (model.state != ViewState.Error &&
                      model.state != ViewState.ErrorLocal) {
                    Utils.hideKeyboard(context);
                    Navigator.push(context, FadePage(page: PaymentMethod()))
                        .then(
                      (value) {
                        Navigator.push(
                          context,
                          FadePage(
                            page: ConfirmPaymentPage(
                              advanceModel: advanceModel,
                              selectedPaymentMethod: value,
                              patientInfoAndMobileNumber:
                                  model.patientInfoAndMobileNumber,
                              authenticatedUser: authUser,
                            ),
                          ),
                        );
                      },
                    );
                  }
                });
              },
            ),
          )),
    );
  }

  void confirmSelectBeneficiaryDialog(MyBalanceViewModel model) {
    showDialog(
      context: context,
      child: SelectBeneficiaryDialog(
        beneficiaryType: beneficiaryType,
        onValueSelected: (value) {
          setState(() {
            if (value == BeneficiaryType.MyAccount) {
              _fileTextController.text = model.user.patientID.toString();
              advanceModel.depositorName =
                  model.user.firstName + " " + model.user.lastName;
            } else
              _fileTextController.text = "";

            beneficiaryType = value;
          });
        },
      ),
    );
  }

  void confirmSelectHospitalDialog(List<HospitalsModel> hospitals) {
    showDialog(
      context: context,
      child: SelectHospitalDialog(
        hospitals: hospitals,
        selectedHospital: _selectedHospital,
        onValueSelected: (value) {
          setState(() {
            _selectedHospital = value;
          });
        },
      ),
    );
  }

  void confirmSelectPatientDialog(List<PatientInfo> patientInfoList) {
    showDialog(
      context: context,
      child: SelectPatientInfoDialog(
        patientInfoList: patientInfoList,
        selectedPatientInfo: _selectedPatientInfo,
        onValueSelected: (value) {
          setState(() {
            advanceModel.depositorName = value.fullName;
            _selectedPatientInfo = value;
          });
        },
      ),
    );
  }

  void confirmSelectFamilyDialog(
      List<GetAllSharedRecordsByStatusList> getAllSharedRecordsByStatusList) {
    if (getAllSharedRecordsByStatusList.isNotEmpty)
      showDialog(
        context: context,
        child: SelectPatientFamilyDialog(
          getAllSharedRecordsByStatusList: getAllSharedRecordsByStatusList,
          selectedPatientFamily: selectedPatientFamily,
          onValueSelected: (value) {
            setState(() {
              selectedPatientFamily = value;
              _fileTextController.text =
                  selectedPatientFamily.responseID.toString();
              advanceModel.depositorName = value.patientName;
            });
          },
        ),
      );
  }

  String getBeneficiaryType() {
    switch (beneficiaryType) {
      case BeneficiaryType.MyAccount:
        return TranslationBase.of(context).myAccount;
      case BeneficiaryType.MyFamilyFiles:
        return TranslationBase.of(context).myFamilyFiles;
        break;
      case BeneficiaryType.OtherAccount:
        return TranslationBase.of(context).otherAccount;
        break;
      case BeneficiaryType.NON:
        return TranslationBase.of(context).selectBeneficiary;
    }
    return TranslationBase.of(context).selectBeneficiary;
  }

  String getHospitalName() {
    if (_selectedHospital != null)
      return _selectedHospital.name;
    else
      return TranslationBase.of(context).selectHospital;
  }

  String getPatientName() {
    if (_selectedPatientInfo != null)
      return _selectedPatientInfo.fullName;
    else
      return TranslationBase.of(context).selectPatientName;
  }

  getAuthUser() async {
    if (await this.sharedPref.getObject(USER_PROFILE) != null) {
      var data = AuthenticatedUser.fromJson(
          await this.sharedPref.getObject(USER_PROFILE));
      setState(() {
        authUser = data;
      });
    }
  }

  String getFamilyMembersName() {
    if (selectedPatientFamily != null)
      return selectedPatientFamily.patientName;
    else
      return TranslationBase.of(context).selectFamilyPatientName;
  }
}
