import 'package:doctor_app_flutter/config/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/helpers.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-page-header-widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.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/dialogs/dailog-list-select.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.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();

  @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'];

    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,
        body: SingleChildScrollView(
          child: Container(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                /*if (model.state == ViewState.BusyLocal)
                  Container(
                      color: Colors.white,
                      width: 50,
                      height: 50,
                      child: AppLoaderWidget(
                        containerColor: Colors.white,
                      )),*/
                Column(
                  children: [
                    PatientPageHeaderWidget(patient),
                    const Divider(
                      color: Color(0xffCCCCCC),
                      height: 1,
                      thickness: 2,
                      indent: 0,
                      endIndent: 0,
                    ),
                    model.patientReferral.length == 0
                        ? ReferralForm(model, screenSize)
                        : PatientReferralItemWidget(
                            "${model.patientReferral[model.patientReferral.length -1].patientID}",
                            patientName: model.patientReferral[model.patientReferral.length -1].patientName,
                            referralStatus:
                                "${model.patientReferral[model.patientReferral.length -1].referralStatus}",
                            isReferredTo: true,
                            isSameBranch: model
                                .patientReferral[model.patientReferral.length -1].isReferralDoctorSameBranch,
                            referralDoctorName:
                                model.patientReferral[model.patientReferral.length -1].referredByDoctorInfo,
                            clinicDescription: null,
                            remark: model.patientReferral[model.patientReferral.length -1].remarksFromSource,
                            referredOn: model.patientReferral[model.patientReferral.length -1].referredOn,
                            answerFromTarget:
                                model.patientReferral[model.patientReferral.length -1].answerFromTarget,
                          ),
                  ],
                ),
                if (model.patientReferral.length == 0)
                  Container(
                    margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
                    child: AppButton(
                      title: TranslationBase.of(context).refer,
                      color: HexColor("#B8382B"),
                      onPressed: () {
                        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: 16, horizontal: 16),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          SizedBox(
            height: 16,
          ),
          AppText(
            TranslationBase.of(context).referPatient,
            fontWeight: FontWeight.bold,
            fontSize: 16,
          ),
          SizedBox(
            height: 16,
          ),
          Container(
            height: screenSize.height * 0.070,
            child: InkWell(
              onTap: 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);
                                }
                              }
                            });
                          });
                        },
                      );
                      showDialog(
                        barrierDismissible: false,
                        context: context,
                        builder: (BuildContext context) {
                          return dialog;
                        },
                      );
                    }
                  : null,
              child: TextField(
                decoration: Helpers.textFieldSelectorDecoration(
                    TranslationBase.of(context).referTo,
                    _referTo != null ? _referTo['name'] : null,
                    true),
                enabled: false,
              ),
            ),
          ),
          SizedBox(
            height: 10,
          ),
          Container(
            height: screenSize.height * 0.070,
            child: InkWell(
              onTap: 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,
              child: TextField(
                decoration: Helpers.textFieldSelectorDecoration(
                    TranslationBase.of(context).branch,
                    _selectedBranch != null
                        ? _selectedBranch['facilityName']
                        : null,
                    true),
                enabled: false,
              ),
            ),
          ),
          SizedBox(
            height: 10,
          ),
          Container(
            height: screenSize.height * 0.070,
            child: InkWell(
              onTap: _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(
                                    _selectedClinic['ClinicID'].toString())
                                .then((_) =>
                                    GifLoaderDialogUtils.hideDialog(context));
                            if (model.state == ViewState.ErrorLocal) {
                              DrAppToastMsg.showErrorToast(model.error);
                            }
                          });
                        },
                      );
                      showDialog(
                        barrierDismissible: false,
                        context: context,
                        builder: (BuildContext context) {
                          return dialog;
                        },
                      );
                    }
                  : null,
              child: TextField(
                decoration: Helpers.textFieldSelectorDecoration(
                    TranslationBase.of(context).clinic,
                    _selectedClinic != null
                        ? _selectedClinic['ClinicDescription']
                        : null,
                    true),
                enabled: false,
              ),
            ),
          ),
          SizedBox(
            height: 10,
          ),
          Container(
            height: screenSize.height * 0.070,
            child: InkWell(
              onTap: _selectedClinic != null &&
                      model.doctorsList != null &&
                      model.doctorsList.length > 0
                  ? () {
                      ListSelectDialog dialog = ListSelectDialog(
                        list: model.doctorsList,
                        attributeName: 'DoctorName',
                        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;
                        },
                      );
                    }
                  : null,
              child: TextField(
                decoration: Helpers.textFieldSelectorDecoration(
                    TranslationBase.of(context).doctor,
                    _selectedDoctor != null
                        ? _selectedDoctor['DoctorName']
                        : null,
                    true),
                enabled: false,
              ),
            ),
          ),
          SizedBox(
            height: 10,
          ),
          Container(
            height: screenSize.height * 0.070,
            child: InkWell(
              onTap: () => _selectDate(context, model),
              child: TextField(
                decoration: Helpers.textFieldSelectorDecoration(
                    TranslationBase.of(context).chooseAppointment,
                    appointmentDate != null
                        ? "${DateUtils.convertDateToFormat(appointmentDate, "yyyy-MM-dd")}"
                        : null,
                    true,
                    suffixIcon: Icon(
                      Icons.calendar_today,
                      color: Colors.black,
                    )),
                enabled: false,
              ),
            ),
          ),
          SizedBox(
            height: 10,
          ),
          Container(
              child: TextField(
            decoration: Helpers.textFieldSelectorDecoration(
                TranslationBase.of(context).remarks, null, false),
            enabled: true,
            controller: _remarksController,
            // inputFormatters: [
            //   FilteringTextInputFormatter.allow(RegExp(ONLY_LETTERS))
            // ],
            keyboardType: TextInputType.text,
            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;
      });
    }
  }
}
