import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/patient-referral-item-widget.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/dialogs/dailog-list-select.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:hexcolor/hexcolor.dart';

class PatientMakeReferralScreen extends StatefulWidget {
  // previous design page is: ReferPatientScreen
  @override
  _PatientMakeReferralScreenState createState() =>
      _PatientMakeReferralScreenState();
}

class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
  PatiantInformtion patient;
  List<dynamic> referToList;
  dynamic _referTo;
  dynamic _selectedBranch;
  dynamic _selectedClinic;
  dynamic _selectedDoctor;
  DateTime appointmentDate;
  final _remarksController = TextEditingController();

  String branchError = null;
  String hospitalError = null;
  String clinicError = null;
  String doctorError = null;

  @override
  void initState() {
    super.initState();

    appointmentDate = DateTime.now();
  }

  @override
  Widget build(BuildContext context) {
    final routeArgs = ModalRoute.of(context).settings.arguments as Map;
    patient = routeArgs['patient'];
    String patientType = routeArgs['patientType'];
    String arrivalType = routeArgs['arrivalType'];

    referToList = List();
    dynamic sameBranch = {
      "id": 1,
      "name": TranslationBase.of(context).sameBranch
    };
    dynamic otherBranch = {
      "id": 2,
      "name": TranslationBase.of(context).otherBranch
    };
    referToList.add(sameBranch);
    referToList.add(otherBranch);

    final screenSize = MediaQuery.of(context).size;

    return BaseView<PatientReferralViewModel>(
      onModelReady: (model) => model.getPatientReferral(patient),
      builder: (_, model, w) => AppScaffold(
        baseViewModel: model,
        appBarTitle: TranslationBase.of(context).referPatient,
        isShowAppBar: true,
        appBar: PatientProfileHeaderNewDesignAppBar(
            patient, patientType, arrivalType),
        body: SingleChildScrollView(
          child: Container(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    /*PatientProfileHeaderNewDesign(
                        patient, patientType, arrivalType),*/
                    Container(
                      margin: EdgeInsets.all(16.0),
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          AppText(
                            "${TranslationBase.of(context).refer}",
                            fontFamily: 'Poppins',
                            fontSize: SizeConfig.textMultiplier * 1.6,
                            fontWeight: FontWeight.w600,
                          ),
                          AppText(
                            "${TranslationBase.of(context).patient}",
                            fontFamily: 'Poppins',
                            fontSize: SizeConfig.textMultiplier * 3,
                            fontWeight: FontWeight.bold,
                          )
                        ],
                      ),
                    ),
                    model.patientReferral.length == 0
                        ? referralForm(model, screenSize)
                        : PatientReferralItemWidget(
                            referralStatus: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .referralStatus,
                            patientName: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .patientName,
                            patientGender: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .patientDetails
                                .gender,
                            referredDate: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .referredOn
                                .split(" ")[0],
                            referredTime: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .referredOn
                                .split(" ")[1],
                            patientID:
                                "${model.patientReferral[model.patientReferral.length - 1].patientID}",
                            isSameBranch: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .isReferralDoctorSameBranch,
                            isReferral: true,
                            remark: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .remarksFromSource,
                            nationality: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .patientDetails
                                .nationalityName,
                            nationalityFlag: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .nationalityFlagUrl,
                            doctorAvatar: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .doctorImageUrl,
                            referralDoctorName: model
                                .patientReferral[
                                    model.patientReferral.length - 1]
                                .referredByDoctorInfo,
                            clinicDescription: null,
                          ),
                  ],
                ),
                if (model.patientReferral.length == 0)
                  Container(
                    margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
                    child: AppButton(
                      title: TranslationBase.of(context).refer,
                      fontWeight: FontWeight.w700,
                      color: HexColor("#359846"),
                      onPressed: () {
                        setState(() {
                          if (_referTo == null) {
                            branchError =
                                TranslationBase.of(context).fieldRequired;
                          } else {
                            branchError = null;
                          }
                          if (_selectedBranch == null) {
                            hospitalError =
                                TranslationBase.of(context).fieldRequired;
                          } else {
                            hospitalError = null;
                          }
                          if (_selectedClinic == null) {
                            clinicError =
                                TranslationBase.of(context).fieldRequired;
                          } else {
                            clinicError = null;
                          }
                          if (_selectedDoctor == null) {
                            doctorError =
                                TranslationBase.of(context).fieldRequired;
                          } else {
                            doctorError = null;
                          }
                        });
                        if (appointmentDate == null ||
                            _selectedBranch == null ||
                            _selectedClinic == null ||
                            _selectedDoctor == null ||
                            _remarksController.text == null) return;
                        model
                            .makeReferral(
                                patient,
                                appointmentDate.toIso8601String(),
                                _selectedBranch['facilityId'],
                                _selectedClinic['ClinicID'],
                                _selectedDoctor['DoctorID'],
                                _remarksController.text)
                            .then((_) {
                          DrAppToastMsg.showSuccesToast(
                              TranslationBase.of(context).referralSuccessMsg);
                          Navigator.pop(context);
                        });
                      },
                    ),
                  )
              ],
            ),
          ),
        ),
      ),
    );
  }

  Widget referralForm(PatientReferralViewModel model, Size screenSize) {
    return Container(
      margin: EdgeInsets.symmetric(vertical: 0, horizontal: 16),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          AppTextFieldCustom(
            height: screenSize.height * 0.075,
            hintText: TranslationBase.of(context).branch,
            dropDownText: _referTo != null ? _referTo['name'] : null,
            enabled: false,
            isTextFieldHasSuffix: true,
            validationError: branchError,
            onClick: referToList != null
                ? () {
                    ListSelectDialog dialog = ListSelectDialog(
                      list: referToList,
                      attributeName: 'name',
                      attributeValueId: 'id',
                      okText: TranslationBase.of(context).ok,
                      okFunction: (selectedValue) {
                        setState(() {
                          _referTo = selectedValue;
                          _selectedBranch = null;
                          _selectedClinic = null;
                          _selectedDoctor = null;
                          model.getDoctorBranch().then((value) async {
                            _selectedBranch = value;
                            if (_referTo['id'] == 1) {
                              GifLoaderDialogUtils.showMyDialog(context);
                              await model
                                  .getClinics(_selectedBranch['facilityId'])
                                  .then((_) =>
                                      GifLoaderDialogUtils.hideDialog(context));
                              if (model.state == ViewState.ErrorLocal) {
                                DrAppToastMsg.showErrorToast(model.error);
                              }
                            } else {
                              _selectedBranch = null;
                            }
                          });
                        });
                      },
                    );
                    showDialog(
                      barrierDismissible: false,
                      context: context,
                      builder: (BuildContext context) {
                        return dialog;
                      },
                    );
                  }
                : null,
          ),
          SizedBox(
            height: 10,
          ),
          AppTextFieldCustom(
            height: screenSize.height * 0.075,
            hintText: TranslationBase.of(context).hospital,
            dropDownText: _selectedBranch != null
                ? _selectedBranch['facilityName']
                : null,
            enabled: false,
            isTextFieldHasSuffix: true,
            validationError: hospitalError,
            onClick: model.branchesList != null &&
                    model.branchesList.length > 0 &&
                    _referTo != null &&
                    _referTo['id'] == 2
                ? () {
                    ListSelectDialog dialog = ListSelectDialog(
                      list: model.branchesList,
                      attributeName: 'facilityName',
                      attributeValueId: 'facilityId',
                      okText: TranslationBase.of(context).ok,
                      okFunction: (selectedValue) {
                        setState(() async {
                          _selectedBranch = selectedValue;
                          _selectedClinic = null;
                          _selectedDoctor = null;
                          GifLoaderDialogUtils.showMyDialog(context);
                          await model
                              .getClinics(_selectedBranch['facilityId'])
                              .then((_) =>
                                  GifLoaderDialogUtils.hideDialog(context));
                          if (model.state == ViewState.ErrorLocal) {
                            DrAppToastMsg.showErrorToast(model.error);
                          }
                        });
                      },
                    );
                    showDialog(
                      barrierDismissible: false,
                      context: context,
                      builder: (BuildContext context) {
                        return dialog;
                      },
                    );
                  }
                : null,
          ),
          SizedBox(
            height: 10,
          ),
          AppTextFieldCustom(
            height: screenSize.height * 0.075,
            hintText: TranslationBase.of(context).clinic,
            dropDownText: _selectedClinic != null
                ? _selectedClinic['ClinicDescription']
                : null,
            enabled: false,
            isTextFieldHasSuffix: true,
            validationError: clinicError,
            onClick: _selectedBranch != null &&
                    model.clinicsList != null &&
                    model.clinicsList.length > 0
                ? () {
                    ListSelectDialog dialog = ListSelectDialog(
                      list: model.clinicsList,
                      attributeName: 'ClinicDescription',
                      attributeValueId: 'ClinicID',
                      usingSearch: true,
                      hintSearchText: TranslationBase.of(context).clinicSearch,
                      okText: TranslationBase.of(context).ok,
                      okFunction: (selectedValue) {
                        setState(() async {
                          _selectedDoctor = null;
                          _selectedClinic = selectedValue;
                          GifLoaderDialogUtils.showMyDialog(context);
                          await model
                              .getClinicDoctors(
                                  patient,
                                  _selectedClinic['ClinicID'],
                                  _selectedBranch['facilityId'])
                              .then((_) =>
                                  GifLoaderDialogUtils.hideDialog(context));
                          if (model.state == ViewState.ErrorLocal) {
                            DrAppToastMsg.showErrorToast(model.error);
                          }
                        });
                      },
                    );
                    showDialog(
                      barrierDismissible: false,
                      context: context,
                      builder: (BuildContext context) {
                        return dialog;
                      },
                    );
                  }
                : null,
          ),
          SizedBox(
            height: 10,
          ),
          AppTextFieldCustom(
            height: screenSize.height * 0.075,
            hintText: TranslationBase.of(context).doctor,
            dropDownText:
                _selectedDoctor != null ? _selectedDoctor['Name'] : null,
            enabled: false,
            isTextFieldHasSuffix: true,
            validationError: doctorError,
            onClick: _selectedClinic != null &&
                    model.doctorsList != null &&
                    model.doctorsList.length > 0
                ? () {
                    ListSelectDialog dialog = ListSelectDialog(
                      list: model.doctorsList,
                      attributeName: 'Name',
                      attributeValueId: 'DoctorID',
                      usingSearch: true,
                      hintSearchText: TranslationBase.of(context).doctorSearch,
                      okText: TranslationBase.of(context).ok,
                      okFunction: (selectedValue) {
                        setState(() {
                          _selectedDoctor = selectedValue;
                        });
                      },
                    );
                    showDialog(
                      barrierDismissible: false,
                      context: context,
                      builder: (BuildContext context) {
                        return dialog;
                      },
                    );
                  }
                : () {
                    if (_selectedClinic == null) {
                      DrAppToastMsg.showErrorToast(
                          "You need to select a clinic first");
                    } else if (model.doctorsList == null ||
                        model.doctorsList.length == 0) {
                      DrAppToastMsg.showErrorToast(
                          "There is no doctors for this clinic");
                    }
                  },
          ),
          SizedBox(
            height: 10,
          ),
          AppTextFieldCustom(
            height: screenSize.height * 0.075,
            hintText: TranslationBase.of(context).date,
            dropDownText: appointmentDate != null
                ? "${DateUtils.convertDateToFormat(appointmentDate, "yyyy-MM-dd")}"
                : null,
            enabled: false,
            isTextFieldHasSuffix: true,
            suffixIcon: IconButton(
                icon: Icon(
              Icons.calendar_today,
              color: Colors.black,
            )),
            onClick: () {
              _selectDate(context, model);
            },
          ),
          SizedBox(
            height: 10,
          ),
          AppTextFieldCustom(
            hintText: TranslationBase.of(context).dietTypeRemarks,
            controller: _remarksController,
            inputType: TextInputType.multiline,
            minLines: 4,
            maxLines: 6,
          ),
        ],
      ),
    );
  }

  _selectDate(BuildContext context, PatientReferralViewModel model) async {
    // https://medium.com/flutter-community/a-deep-dive-into-datepicker-in-flutter-37e84f7d8d6c   good reference
    // https://stackoverflow.com/a/63147062/6246772  to customize a date picker
    final DateTime picked = await showDatePicker(
      context: context,
      initialDate: appointmentDate,
      firstDate: DateTime.now().add(Duration(hours: 2)),
      lastDate: DateTime(2040),
      initialEntryMode: DatePickerEntryMode.calendar,
    );
    if (picked != null && picked != appointmentDate) {
      setState(() {
        appointmentDate = picked;
      });
    }
  }
}
