import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/models/patient/patient_model.dart';
import 'package:doctor_app_flutter/routes.dart';
import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:provider/provider.dart';

import '../../config/config.dart';
import '../../config/size_config.dart';
import '../../lookups/patient_lookup.dart';
import '../../widgets/patients/dynamic_elements.dart';
import '../../widgets/shared/app_scaffold_widget.dart';
import '../../widgets/shared/app_texts_widget.dart';
import '../../widgets/shared/buttons/app_buttons_widget.dart';
import '../../widgets/shared/rounded_container_widget.dart';
import '../../widgets/shared/text_fields/app_text_form_field.dart';

DrAppSharedPreferances sharedPref = new DrAppSharedPreferances();
Helpers helpers = Helpers();

// OWNER : Ibrahim albitar
// DATE : 19-04-2020
// DESCRIPTION : Patient Search Screen.

class PatientSearchScreen extends StatefulWidget {
  @override
  _PatientSearchScreenState createState() => _PatientSearchScreenState();
}

class _PatientSearchScreenState extends State<PatientSearchScreen> {
  String _selectedType = '1';
  String _selectedLocation = '1';
  String error = '';
  ProjectViewModel projectsProvider;
  String itemText = '';
  String itemText2 = '';
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  bool _autoValidate = false;
  bool onlyArrived = true;
  bool isView = false;
  bool isFormSubmitted = false;

  FocusNode _nodeText1 = FocusNode();
  FocusNode _nodeText2 = FocusNode();
  FocusNode _nodeText3 = FocusNode();

  var _patientSearchFormValues = PatientModel(
      FirstName: "0",
      MiddleName: "0",
      LastName: "0",
      PatientMobileNumber: "0",
      PatientIdentificationID: "0",
      MobileNo: '0',
      PatientID: 0,
      From: "0",
      To: "0",
      LanguageID: 2,
      stamp: "2020-03-02T13:56:39.170Z",
      IPAdress: "11.11.11.11",
      VersionID: 1.2,
      Channel: 9,
      TokenID: "2Fi7HoIHB0eDyekVa6tCJg==",
      SessionID: "5G0yXn0Jnq",
      IsLoginForDoctorApp: true,
      IdentificationNo: '0',
      PatientOutSA: false);

  void _validateInputs() async {
    setState(() {
      isFormSubmitted = true;
    });

    try {
      if (_formKey.currentState.validate()) {
        _formKey.currentState.save();

        if ((_patientSearchFormValues.From == "0" ||
                    _patientSearchFormValues.To == "0") &&
                _selectedType == "7" ||
            ((_patientSearchFormValues.From == "0" ||
                    _patientSearchFormValues.To == "0") &&
                _selectedType == "6")) {
          // Helpers.showErrorToast("Please Choose The Dates");
        } else {
          setState(() {
            isFormSubmitted = false;
          });
          Navigator.of(context).pushNamed(PATIENTS, arguments: {
            "patientSearchForm": _patientSearchFormValues,
            "selectedType": _selectedType,
            "isSearch": true,
            "isView": isView
          });
        }
      } else {
        setState(() {
          _autoValidate = true;
        });
      }
    } catch (err) {
      error = err.toString();
    }
  }

  handelCatchErrorCase(err) {
    //isLoading = false;
    //isError = true;
    error = Helpers.generateContactAdminMsg(err);
    //notifyListeners();
    throw err;
  }

  @override
  Widget build(BuildContext context) {
    projectsProvider = Provider.of(context);
    return GestureDetector(
      onTap: () {
        FocusScope.of(context).requestFocus(new FocusNode());
      },
      child: AppScaffold(
        appBarTitle: TranslationBase.of(context).searchPatient,
        isShowAppBar: true,
        body: Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              RoundedContainer(
                showBorder: false,
                child: Column(
                  children: <Widget>[
                    Column(
                      children: <Widget>[
                        // Container(
                        //   child: Icon(
                        //     DoctorApp.search_patient_1,
                        //     size: 100,
                        //     color: Colors.black,
                        //   ),
                        //   margin: EdgeInsets.only(top: 10),
                        // ),
                        // Padding(
                        //   padding: const EdgeInsets.only(top: 12.0),
                        //   child: AppText(
                        //     TranslationBase.of(context)
                        //         .searchPatientImageCaptionTitle
                        //         .toUpperCase(),
                        //     fontWeight: FontWeight.bold,
                        //     fontSize: SizeConfig.heightMultiplier * 2.5,
                        //   ),
                        // ),
                        //     Padding(
                        //       padding: const EdgeInsets.only(top: 5.0),
                        //       child: AppText(
                        //         TranslationBase.of(context)
                        //             .searchPatientImageCaptionBody,
                        //         fontSize: SizeConfig.heightMultiplier * 2,
                        //       ),
                        //     )
                      ],
                    ),
                    Container(
                      padding: EdgeInsets.all(15),
                      width: SizeConfig.screenWidth * 1,
                      child: Form(
                        key: _formKey,
                        autovalidate: _autoValidate,
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            SizedBox(
                              height: 15,
                            ),
                            if (_selectedType != '7')
                              Container(
                                decoration: BoxDecoration(
                                    borderRadius:
                                        BorderRadius.all(Radius.circular(6.0)),
                                    border: Border.all(
                                        width: 1.0,
                                        color: HexColor("#CCCCCC"))),
                                padding: EdgeInsets.all(10),
                                child: AppTextFormField(
                                  labelText: TranslationBase.of(context)
                                      .patpatientIDMobilenationalientID,
                                  borderColor: Colors.white,
                                  textInputType: TextInputType.number,
                                  textInputAction: TextInputAction.done,
                                  inputFormatter: ONLY_NUMBERS,
                                  focusNode: _nodeText1,
                                  onSaved: (value) {
                                    if (value != null && value != '') {
                                      if (value.length == 10 &&
                                          (value[0] == '2' ||
                                              value[0] == '1')) {
                                        _patientSearchFormValues
                                            .IdentificationNo = value;
                                        _patientSearchFormValues.Searchtype = 2;
                                        _patientSearchFormValues.setPatientID =
                                            0;
                                      } else if ((value.length == 10 ||
                                              value.length == 9) &&
                                          ((value[0] == '0' &&
                                                  value[1] == '5') ||
                                              value[0] == '5')) {
                                        _patientSearchFormValues.MobileNo =
                                            value;
                                        _patientSearchFormValues.Searchtype = 0;
                                      } else {
                                        _patientSearchFormValues.setPatientID =
                                            int.parse(value);
                                        _patientSearchFormValues.Searchtype = 1;
                                      }
                                    }

                                    // else{

                                    // }

                                    // value == null || value == ''
                                    //     ? _patientSearchFormValues.setPatientID =
                                    //         0
                                    //     : _patientSearchFormValues.setPatientID =
                                    //         int.parse(value);

                                    // if (value != null &&
                                    //     value.toString().trim().isEmpty) {
                                    //   _patientSearchFormValues.setPatientID = 0;
                                    // }
                                  },
                                ),
                              ),
                            SizedBox(
                              height: 10,
                            ),
                            // Row(
                            //   mainAxisAlignment: MainAxisAlignment.end,
                            //   children: [
                            //     InkWell(
                            //       child: this.isView == false
                            //           ? AppText(
                            //               TranslationBase.of(context)
                            //                   .searchWithOther,
                            //               color: Colors.red,
                            //               fontWeight: FontWeight.bold,
                            //             )
                            //           : AppText(
                            //               TranslationBase.of(context)
                            //                   .hideOtherCriteria,
                            //               color: Colors.red,
                            //               fontWeight: FontWeight.bold),
                            //       onTap: () {
                            //         setState(() {
                            //           this.isView = !this.isView;
                            //         });
                            //       },
                            //     )
                            //   ],
                            // ),
                            isView == true
                                ? Column(children: [
                                    SizedBox(
                                      height: 10,
                                    ),
                                    Container(
                                      height: 65.0,
                                      decoration: ShapeDecoration(
                                        shape: RoundedRectangleBorder(
                                          side: BorderSide(
                                              width: 1.0,
                                              style: BorderStyle.solid,
                                              color: HexColor("#CCCCCC")),
                                          borderRadius: BorderRadius.all(
                                              Radius.circular(6.0)),
                                        ),
                                      ),
                                      width: double.infinity,
                                      child: Padding(
                                        padding: EdgeInsets.only(
                                            top: SizeConfig.widthMultiplier *
                                                0.9,
                                            bottom: SizeConfig.widthMultiplier *
                                                0.9,
                                            right:
                                                SizeConfig.widthMultiplier * 3,
                                            left:
                                                SizeConfig.widthMultiplier * 3),
                                        child: Row(
                                          mainAxisSize: MainAxisSize.max,
                                          children: <Widget>[
                                            Expanded(
                                              // add Expanded to have your dropdown button fill remaining space
                                              child:
                                                  DropdownButtonHideUnderline(
                                                      child: DropdownButton(
                                                isExpanded: true,
                                                value: _selectedType,
                                                iconSize: 25,
                                                elevation: 16,
                                                selectedItemBuilder:
                                                    (BuildContext context) {
                                                  return PATIENT_TYPE_Des.map(
                                                      (item) {
                                                    return Row(
                                                      mainAxisSize:
                                                          MainAxisSize.max,
                                                      children: <Widget>[
                                                        !projectsProvider
                                                                .isArabic
                                                            ? AppText(
                                                                item['text'],
                                                                fontSize: SizeConfig
                                                                        .textMultiplier *
                                                                    2.1,
                                                              )
                                                            : AppText(
                                                                item['text_ar'],
                                                                fontSize: SizeConfig
                                                                        .textMultiplier *
                                                                    2.1,
                                                              ),
                                                      ],
                                                    );
                                                  }).toList();
                                                },
                                                onChanged: (String newValue) =>
                                                    {
                                                  setState(() {
                                                    _selectedType = newValue;
                                                    selectedPatientType =
                                                        int.parse(
                                                            _selectedType);
                                                  })
                                                },
                                                items: PATIENT_TYPE_Des.map(
                                                    (item) {
                                                  !projectsProvider.isArabic
                                                      ? itemText = item['text']
                                                      : itemText =
                                                          item['text_ar'];
                                                  return DropdownMenuItem(
                                                    child: Text(
                                                      itemText,
                                                      textAlign: TextAlign.end,
                                                    ),
                                                    value: item['val'],
                                                  );
                                                }).toList(),
                                              )),
                                            ),
                                          ],
                                        ),
                                      ),
                                    ),
                                    SizedBox(
                                      height: 10,
                                    ),
                                    Container(
                                      decoration: BoxDecoration(
                                          borderRadius: BorderRadius.all(
                                              Radius.circular(6.0)),
                                          border: Border.all(
                                              width: 1.0,
                                              color: HexColor("#CCCCCC"))),
                                      padding: EdgeInsets.all(10),
                                      child: AppTextFormField(
                                          labelText: TranslationBase.of(context)
                                              .firstName,
                                          borderColor: Colors.white,
                                          onSaved: (value) {
                                            value == null || value == ''
                                                ? _patientSearchFormValues
                                                    .setFirstName = "0"
                                                : _patientSearchFormValues
                                                    .setFirstName = value;

                                            if (value != null &&
                                                value
                                                    .toString()
                                                    .trim()
                                                    .isEmpty) {
                                              _patientSearchFormValues
                                                  .setFirstName = "0";
                                            }
                                          },
                                          // validator: (value) {
                                          //   return TextValidator().validateName(value);
                                          // },
                                          inputFormatter: ONLY_LETTERS),
                                    ),
                                    SizedBox(
                                      height: 10,
                                    ),
                                    if (_selectedType != '7')
                                      Container(
                                        decoration: BoxDecoration(
                                            borderRadius: BorderRadius.all(
                                                Radius.circular(6.0)),
                                            border: Border.all(
                                                width: 1.0,
                                                color: HexColor("#CCCCCC"))),
                                        padding: EdgeInsets.all(10),
                                        child: AppTextFormField(
                                          labelText: TranslationBase.of(context)
                                              .phoneNumber,
                                          borderColor: Colors.white,
                                          textInputType: TextInputType.number,
                                          textInputAction: TextInputAction.done,
                                          inputFormatter: ONLY_NUMBERS,
                                          focusNode: _nodeText1,
                                          onSaved: (value) {
                                            value == null || value == ''
                                                ? _patientSearchFormValues
                                                        .setPatientMobileNumber =
                                                    "0"
                                                : _patientSearchFormValues
                                                        .setPatientMobileNumber =
                                                    value;

                                            if (value != null &&
                                                value
                                                    .toString()
                                                    .trim()
                                                    .isEmpty) {
                                              _patientSearchFormValues
                                                  .setPatientMobileNumber = "0";
                                            }
                                          },
                                        ),
                                      ),
                                    SizedBox(
                                      height: 10,
                                    ),
                                    Container(
                                      decoration: BoxDecoration(
                                          borderRadius: BorderRadius.all(
                                              Radius.circular(6.0)),
                                          border: Border.all(
                                              width: 1.0,
                                              color: HexColor("#CCCCCC"))),
                                      padding: EdgeInsets.all(10),
                                      child: AppTextFormField(
                                          labelText: TranslationBase.of(context)
                                              .middleName,
                                          borderColor: Colors.white,
                                          onSaved: (value) {
                                            value == null || value == ''
                                                ? _patientSearchFormValues
                                                    .setMiddleName = "0"
                                                : _patientSearchFormValues
                                                    .setMiddleName = value;
                                            if (value != null &&
                                                value
                                                    .toString()
                                                    .trim()
                                                    .isEmpty) {
                                              _patientSearchFormValues
                                                  .setMiddleName = "0";
                                            }
                                          },
                                          // validator: (value) {
                                          //   return TextValidator().validateName(value);
                                          // },
                                          inputFormatter: ONLY_LETTERS),
                                    ),
                                    SizedBox(
                                      height: 10,
                                    ),
                                    Container(
                                      decoration: BoxDecoration(
                                          borderRadius: BorderRadius.all(
                                              Radius.circular(6.0)),
                                          border: Border.all(
                                              width: 1.0,
                                              color: HexColor("#CCCCCC"))),
                                      padding: EdgeInsets.all(10),
                                      child: AppTextFormField(
                                          labelText: TranslationBase.of(context)
                                              .lastName,
                                          borderColor: Colors.white,
                                          onSaved: (value) {
                                            value == null || value == ''
                                                ? _patientSearchFormValues
                                                    .setLastName = "0"
                                                : _patientSearchFormValues
                                                    .setLastName = value;
                                            if (value != null &&
                                                value
                                                    .toString()
                                                    .trim()
                                                    .isEmpty) {
                                              _patientSearchFormValues
                                                  .setLastName = "0";
                                            }
                                          },
                                          inputFormatter: ONLY_LETTERS),
                                    ),
                                    SizedBox(
                                      height: 10,
                                    ),
                                    Container(
                                      decoration: BoxDecoration(
                                          borderRadius: BorderRadius.all(
                                              Radius.circular(6.0)),
                                          border: Border.all(
                                              width: 1.0,
                                              color: HexColor("#CCCCCC"))),
                                      padding: EdgeInsets.all(10),
                                      child: AppTextFormField(
                                          labelText: TranslationBase.of(context)
                                              .patientID,
                                          borderColor: Colors.white,
                                          textInputType: TextInputType.number,
                                          inputFormatter: ONLY_NUMBERS,
                                          focusNode: _nodeText2,
                                          onSaved: (value) {
                                            value == null || value == ''
                                                ? _patientSearchFormValues
                                                    .setPatientID = 0
                                                : _patientSearchFormValues
                                                        .setPatientID =
                                                    int.parse(value);
                                            if (value != null &&
                                                value
                                                    .trim()
                                                    .toString()
                                                    .isEmpty) {
                                              _patientSearchFormValues
                                                  .setPatientID = 0;
                                            }
                                          }),
                                    ),
                                    SizedBox(
                                      height: 10,
                                    ),
                                    Container(
                                      decoration: BoxDecoration(
                                          borderRadius: BorderRadius.all(
                                              Radius.circular(6.0)),
                                          border: Border.all(
                                              width: 1.0,
                                              color: HexColor("#CCCCCC"))),
                                      padding: EdgeInsets.all(10),
                                      child: AppTextFormField(
                                        labelText: TranslationBase.of(context)
                                            .patientFile,
                                        borderColor: Colors.white,
                                        textInputType: TextInputType.number,
                                        focusNode: _nodeText3,
                                        inputFormatter: ONLY_NUMBERS,
                                        onSaved: (value) {},
                                      ),
                                    ),
                                    (!(_selectedType == '2' ||
                                            _selectedType == '4'))
                                        ? DynamicElements(
                                            _patientSearchFormValues,
                                            isFormSubmitted)
                                        : SizedBox(
                                            height: 0,
                                          ),
                                    SizedBox(
                                      height: 10,
                                    ),
                                    Container(
                                        child: Row(
                                            mainAxisAlignment:
                                                MainAxisAlignment.start,
                                            children: <Widget>[
                                          Container(
                                            decoration: BoxDecoration(
                                                borderRadius: BorderRadius.all(
                                                    Radius.circular(6.0)),
                                                border: Border.all(
                                                    width: 1.0,
                                                    color:
                                                        HexColor("#CCCCCC"))),
                                            height: 25,
                                            width: 25,
                                            child: Checkbox(
                                                value: onlyArrived,
                                                checkColor: HexColor("#2A930A"),
                                                activeColor: Colors.white,
                                                onChanged: (bool newValue) {
                                                  setState(() {
                                                    onlyArrived = newValue;
                                                  });
                                                }),
                                          ),
                                          SizedBox(
                                            width: 12,
                                          ),
                                          AppText(
                                              TranslationBase.of(context)
                                                  .onlyArrivedPatient,
                                              fontSize:
                                                  SizeConfig.textMultiplier *
                                                      2),
                                        ])),
                                    SizedBox(
                                      height: 10,
                                    ),
                                  ])
                                : SizedBox(
                                    height: 0,
                                  ),
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
              ),
              Column(
                mainAxisAlignment: MainAxisAlignment.end,
                children: [
                  Container(
                    margin: EdgeInsets.all(SizeConfig.widthMultiplier * 5),
                    child: Wrap(
                      alignment: WrapAlignment.center,
                      children: <Widget>[
                        AppButton(
                          title: TranslationBase.of(context).search,
                          color: Colors.red[800],
                          onPressed: () {
                            _validateInputs();
                          },
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            ]),
      ),
    );
  }
}
