import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
import 'package:doctor_app_flutter/core/viewModel/auth_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart';
import 'package:doctor_app_flutter/models/doctor/profile_req_Model.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/models/patient/patient_arrival/get_patient_arrival_list_request_model.dart';
import 'package:doctor_app_flutter/models/patient/patient_model.dart';
import 'package:doctor_app_flutter/models/patient/topten_users_res_model.dart';
import 'package:doctor_app_flutter/routes.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/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/PatientCard.dart';
import 'package:doctor_app_flutter/widgets/patients/clinic_list_dropdwon.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/dr_app_circular_progress_Indeicator.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/app_text_form_field.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';

import '../../config/size_config.dart';
import '../../widgets/shared/app_scaffold_widget.dart';

class PatientsScreen extends StatefulWidget {
  final patientSearchForm;
  final selectedType;
  final isAppbar;
  final arrivalType;
  final isView;
  PatientsScreen(
      {this.patientSearchForm,
      this.selectedType,
      this.isAppbar = true,
      this.arrivalType,
      this.isView});
  @override
  _PatientsScreenState createState() => _PatientsScreenState();
}

class _PatientsScreenState extends State<PatientsScreen> {
  List<dynamic> lItems;

  List parsed;

  List date;
  List unFilterDate;

  int clinicId;
  AuthViewModel authProvider;

  Color sideColor = Colors.black;
  List<PatiantInformtion> responseModelList;
  List<PatiantInformtion> responseModelList2;
  final String url = "assets/images/";
  final String avatarMale = "user_male.svg"; //'working_male.svg';//'user.svg';
  final String avatarFemale = 'user_female.svg';
  final String assetName = 'assets/image.svg';

  List<String> _locations = []; //['All', 'Today', 'Tomorrow', 'Next Week'];

  int _activeLocation = 0;
  bool isInpatient = false;
  bool _isInit = true;
  String patientType;
  bool isSearch = false;
  String patientTypeTitle;
  var _isLoading = true;
  var selectedFilter = 1;
  bool _isError = false;
  String error = "";
  String arrivalType;
  ProjectViewModel projectsProvider;
  var isView;
  final _controller = TextEditingController();

  PatientModel patient;
  var _patientSearchFormValues = PatientModel(
      FirstName: "0",
      MiddleName: "0",
      LastName: "0",
      PatientMobileNumber: "0",
      PatientIdentificationID: "0",
      PatientID: 0,
      From: DateUtils.convertDateToFormat(DateTime.now(), 'yyyy-MM-dd')
          .toString(),
      To: DateUtils.convertDateToFormat(DateTime.now(), 'yyyy-MM-dd')
          .toString(),
      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,
      PatientOutSA: false);
  searchData(String str) {
    this.responseModelList = this.responseModelList2;
    var strExist = str.length > 0 ? true : false;
    if (strExist) {
      List<PatiantInformtion> filterData = [];

      for (var i = 0; i < responseModelList2.length; i++) {
        String firstName = responseModelList[i].firstName.toUpperCase();
        String lastName = responseModelList[i].lastName.toUpperCase();
        String mobile = responseModelList[i].mobileNumber.toUpperCase();
        String patientID = responseModelList[i].patientId.toString();

        if (firstName.contains(str.toUpperCase()) ||
            lastName.contains(str.toUpperCase()) ||
            mobile.contains(str) ||
            patientID.contains(str)) {
          filterData.add(responseModelList[i]);
        }
      }

      setState(() {
        this.responseModelList = filterData;
      });
    } else {
      setState(() {
        this.responseModelList = this.responseModelList2;
      });
    }
  }

  convertDate(String str) {
    String timeConvert;
    const start = "/Date(";

    const end = "+0300)";

    final startIndex = str.indexOf(start);

    final endIndex = str.indexOf(end, startIndex + start.length);

    var date = new DateTime.fromMillisecondsSinceEpoch(
        int.parse(str.substring(startIndex + start.length, endIndex)));

    String newDateformat = date.year.toString() +
        "/" +
        date.month.toString().padLeft(2, '0') +
        "/" +
        date.day.toString().padLeft(2, '0') +
        " " +
        "-" +
        " " +
        date.hour.toString().padLeft(2, '0') +
        ":" +
        date.minute.toString().toString().padLeft(2, '0');

    return newDateformat.toString();
  }

  convertDateFormat(String str) {
    String timeConvert;
    const start = "/Date(";
    const end = "+0300)";

    final startIndex = str.indexOf(start);
    final endIndex = str.indexOf(end, startIndex + start.length);

    var date = new DateTime.fromMillisecondsSinceEpoch(
        int.parse(str.substring(startIndex + start.length, endIndex)));
    String newDate = date.year.toString() +
        "-" +
        date.month.toString().padLeft(2, '0') +
        "-" +
        date.day.toString().padLeft(2, '0');

    return newDate.toString();
  }

  filterBooking(String str) {
    this.responseModelList = this.responseModelList2;

    var strExist = str.length > 0 ? true : false;
    if (true) {
      List<PatiantInformtion> filterDate = [];
      String patiantAppointment = "";
      for (var i = 0; i < responseModelList2.length; i++) {
        try {
          if (responseModelList[i].appointmentDate == "") {
            patiantAppointment = responseModelList[i].arrivedOn;
          } else {
            patiantAppointment =
                convertDateFormat(responseModelList[i].appointmentDate);
          }
          if (patiantAppointment != null) {
            String dateAppointment = checkDate(patiantAppointment);

            if (dateAppointment.contains(str) || str == 'All') {
              filterDate.add(responseModelList[i]);
            }
          }
        } catch (e) {
          print(e);
        }
      }

      setState(() {
        this.responseModelList = filterDate;
      });
    } else {
      setState(() {
        this.responseModelList = this.responseModelList2;
      });
    }
  }

  String checkDate(String dateString) {
    DateTime checkedTime = DateTime.parse(dateString);
    DateTime currentTime = DateTime.now();

    if ((currentTime.year == checkedTime.year) &&
        (currentTime.month == checkedTime.month) &&
        (currentTime.day == checkedTime.day)) {
      return TranslationBase.of(context).today;
    } else if ((currentTime.year == checkedTime.year) &&
        (currentTime.month == checkedTime.month)) {
      if ((currentTime.day - checkedTime.day) == 1) {
        return TranslationBase.of(context).yesterday;
      } else if ((currentTime.day - checkedTime.day) == -1) {
        return TranslationBase.of(context).tomorrow;
      }

      if ((currentTime.day - checkedTime.day) <= -2) {
        return TranslationBase.of(context).nextWeek;
      } else {
        return TranslationBase.of(context).all;
      }
    }
    return TranslationBase.of(context).all;
  }

  @override
  Widget build(BuildContext context) {
    authProvider = Provider.of(context);
    _locations = [
      TranslationBase.of(context).today,
      TranslationBase.of(context).tomorrow,
      TranslationBase.of(context).nextWeek,
    ];
    //TranslationBase.of(context).all,
    projectsProvider = Provider.of(context);
    final routeArgs = ModalRoute.of(context).settings.arguments as Map;

    patient = widget.patientSearchForm != null
        ? widget.patientSearchForm
        : routeArgs['patientSearchForm'];

    patientType = widget.selectedType != null
        ? widget.selectedType
        : routeArgs['selectedType'];
    arrivalType = widget.arrivalType != null
        ? widget.arrivalType
        : routeArgs['arrivalType'];
    if (routeArgs != null && routeArgs.containsKey("isSearch")) {
      isSearch = routeArgs['isSearch'];
    }
    if (routeArgs != null && routeArgs.containsKey("isSearch")) {
      isView = routeArgs['isView'];
      //patient.Searchtype = 1;
    }
    if (routeArgs != null && routeArgs.containsKey('activeFilter')) {
      _activeLocation = routeArgs['activeFilter'];
    }
    if (routeArgs != null && routeArgs.containsKey('isInpatient')) {
      isInpatient = routeArgs['isInpatient'];
    }

    if (!projectsProvider.isArabic)
      patientTypeTitle = SERVICES_PATIANT_HEADER[int.parse(patientType)];
    else
      patientTypeTitle = SERVICES_PATIANT_HEADER_AR[int.parse(patientType)];

    return BaseView<PatientViewModel>(
      onModelReady: (model) {
        // TODO : change all the logic here to make it work with the model and remove future
        int val2 = int.parse(patientType);
        GetPatientArrivalListRequestModel getPatientArrivalListRequestModel;
        if (val2 == 7) {
          getPatientArrivalListRequestModel = GetPatientArrivalListRequestModel(
              from: patient.From,
              to: patient.To,
              pageIndex: 0,
              pageSize: 0,
              patientMRN: patient.getPatientID);
        }

        model
            .getPatientList(
                val2 == 7
                    ? getPatientArrivalListRequestModel.toJson()
                    : patient,
                patientType,
                isView: isView)
            .then((res) {
          setState(() {
            if (res != null && res['MessageStatus'] == 1) {
              if (val2 == 7) {
                if (res[SERVICES_PATIANT2[val2]] == null) {
                  _isError = true;
                  _isLoading = false;
                  this.error = error.toString();
                } else {
                  var localList = [];
                  if (res["patientArrivalList"]["entityList"] == null) {
                    res["patientArrivalList"]["entityList"] = [];
                  }
                  res["patientArrivalList"]["entityList"].forEach((v) {
                    Map<String, dynamic> mergedPatient = {
                      ...v,
                      ...v["patientDetails"]
                    };
                    localList.add(mergedPatient);
                  });
                  lItems = localList;
                }
              } else {
                if (isView == false && val2 == 1) {
                  lItems = res['GetPatientFileInformation_PRMList']
                      .where((i) =>
                          i['PatientTypeDescription'] == 'Permanent File')
                      .toList();
                } else {
                  lItems = res[SERVICES_PATIANT2[val2]];
                }
              }
              parsed = lItems;
              responseModelList = new ModelResponse.fromJson(parsed).list;
              if (val2 == 7) {
                responseModelList.sort((a, b) {
                  if (b.startTime != null && b.startTime != null) {
                    try {
                      DateTime now = DateTime.now();
                      DateFormat dateFormat = DateFormat("yyyy-MM-dd HH:mm");
                      String formattedDate =
                          DateFormat('yyyy-MM-dd ' + a.startTime).format(now);
                      DateTime dateTimeA = dateFormat.parse(formattedDate);
                      String formattedDateB =
                          DateFormat('yyyy-MM-dd ' + b.startTime).format(now);
                      DateTime dateTimeB = dateFormat.parse(formattedDateB);
                      var adate = dateTimeA; //a.startTime;
                      var bdate = dateTimeB;
                      return adate.compareTo(bdate);
                    } on Exception catch (_) {
                      print('never reached');
                      var adate = a.startTime; //a.startTime;
                      var bdate = b.startTime;
                      return adate.compareTo(bdate);
                    }
                  } else {
                    var adate = convertDateFormat(a.appointmentDate);
                    var bdate = convertDateFormat(b.appointmentDate);
                    return bdate.compareTo(adate);
                  }
                });
              }
              responseModelList2 = responseModelList;
              _isError = false;
            } else {
              _isError = true;
              error = model.error ??
                  res['ErrorEndUserMessage'] ??
                  res['ErrorMessage'];
            }

            _isLoading = false;
          });
        }).catchError((error) {
          setState(() {
            _isError = true;
            _isLoading = false;
            this.error = error.toString();
          });
        });
      },
      builder: (_, model, w) => AppScaffold(
        appBarTitle: isSearch? "Search Patient":  patientTypeTitle,
        isShowAppBar: widget.isAppbar,
        isLoading: _isLoading,
        body: _isLoading
            ? Container()
            : _isError
                ? DrAppEmbeddedError(error: error)
                : lItems == null || lItems.length == 0
                    ? Column(
                        children: [
                          Column(children: <Widget>[
                            // Container(
                            //     width: SizeConfig.screenWidth * 0.9,
                            //     height: 75,
                            //     decoration: BoxDecoration(
                            //         borderRadius:
                            //             BorderRadius.all(Radius.circular(6.0)),
                            //         border: Border.all(
                            //           width: 1.0,
                            //           color: HexColor("#CCCCCC"),
                            //         ),
                            //         color: Colors.white),
                            //     child: Column(
                            //         crossAxisAlignment:
                            //             CrossAxisAlignment.start,
                            //         children: [
                            //           Padding(
                            //               padding: EdgeInsets.only(
                            //                   left: 10, top: 10),
                            //               child: AppText(
                            //                 TranslationBase.of(context)
                            //                     .searchPatientName,
                            //                 fontSize: 13,
                            //               )),
                            //           AppTextFormField(
                            //               // focusNode: focusProject,
                            //               controller: _controller,
                            //               borderColor: Colors.white,
                            //               prefix: IconButton(
                            //                 icon: Icon(
                            //                   DoctorApp.filter_1,
                            //                   color: Colors.black,
                            //                 ),
                            //                 iconSize: 20,
                            //                 padding:
                            //                     EdgeInsets.only(bottom: 30),
                            //               ),
                            //               onChanged: (String str) {
                            //                 this.searchData(str);
                            //               }),
                            //         ])),

                            // Container(
                            //   width: SizeConfig.screenWidth * 0.9,
                            //   height: SizeConfig.screenHeight * 0.08,
                            //   child: TextField(
                            //     controller: _controller,
                            //     onChanged: (String str) {
                            //       this.searchData(str);
                            //     },
                            //     decoration: buildInputDecoration(
                            //         context,
                            //         TranslationBase.of(context)
                            //             .searchPatientName),
                            //   ),
                            // ),
                            SizedBox(
                              height: 10.0,
                            ),
                            if (int.parse(patientType) == 7)
                              Container(
                                  padding: EdgeInsets.all(5),
                                  decoration: BoxDecoration(
                                      color: Colors.white,
                                      border: Border.all(color: Colors.grey),
                                      borderRadius: BorderRadius.circular(10)),
                                  child: ClinicList(
                                    clinicId: clinicId,
                                    onClinicChange: (newValue) {
                                      clinicId = newValue;
                                      changeClinic(newValue, context, model);
                                    },
                                  )),
                            Padding(
                              padding: EdgeInsets.only(
                                  top: MediaQuery.of(context).size.height *
                                      0.03),
                              // child: _locationBar(context)
                              child:
                                  SERVICES_PATIANT2[int.parse(patientType)] ==
                                          "List_MyOutPatient"
                                      ? _locationBar(context, model)
                                      : Container(),
                            )
                          ]),
                          Container(
                            margin: EdgeInsets.only(
                                top: MediaQuery.of(context).size.height * 0.10),
                            child: Center(
                              child: Column(
                                crossAxisAlignment: CrossAxisAlignment.center,
                                children: [
                                  SizedBox(
                                    height: 100,
                                  ),
                                  Image.asset('assets/images/no-data.png'),
                                  Padding(
                                    padding: const EdgeInsets.all(8.0),
                                    child: AppText(TranslationBase.of(context)
                                        .youDontHaveAnyPatient),
                                  )
                                ],
                              ),
                            ),
                          ),
                        ],
                      )
                    : Container(
                        color: Colors.grey[200],
                        child: ListView(
                          scrollDirection: Axis.vertical,
                          children: <Widget>[
                            Container(
                              child: lItems == null
                                  ? Column(
                                      crossAxisAlignment:
                                          CrossAxisAlignment.start,
                                      children: <Widget>[
                                        Container(
                                          child: Center(
                                              child: Padding(
                                            padding: const EdgeInsets.fromLTRB(
                                                0, 0, 0, 0), //250
                                            child:
                                                DrAppCircularProgressIndeicator(),
                                          )),
                                        ),
                                      ],
                                    )
                                  : Column(
                                      children: <Widget>[
                                        SizedBox(height: 18.5),

                                        Container(
                                            width: SizeConfig.screenWidth * 0.9,
                                            height: 75,
                                            decoration: BoxDecoration(
                                                borderRadius: BorderRadius.all(
                                                    Radius.circular(6.0)),
                                                border: Border.all(
                                                  width: 1.0,
                                                  color: HexColor("#CCCCCC"),
                                                ),
                                                color: Colors.white),
                                            child: Column(
                                                crossAxisAlignment:
                                                    CrossAxisAlignment.start,
                                                children: [
                                                  Padding(
                                                      padding: EdgeInsets.only(
                                                          left: 10, top: 10),
                                                      child: AppText(
                                                        TranslationBase.of(
                                                                context)
                                                            .searchPatientName,
                                                        fontSize: 13,
                                                      )),
                                                  AppTextFormField(
                                                      // focusNode: focusProject,
                                                      controller: _controller,
                                                      borderColor: Colors.white,
                                                      prefix: IconButton(
                                                        icon: Icon(
                                                          DoctorApp.filter_1,
                                                          color: Colors.black,
                                                        ),
                                                        iconSize: 20,
                                                        padding:
                                                            EdgeInsets.only(
                                                                bottom: 30),
                                                      ),
                                                      onChanged: (String str) {
                                                        this.searchData(str);
                                                      }),
                                                ])),
                                        // Container(
                                        //   width: SizeConfig.screenWidth * 0.9,
                                        //   height:
                                        //       SizeConfig.screenHeight * 0.08,
                                        //   child: TextField(
                                        //     controller: _controller,
                                        //     onChanged: (String str) {
                                        //       this.searchData(str);
                                        //     },
                                        //     decoration: buildInputDecoration(
                                        //         context,
                                        //         TranslationBase.of(context)
                                        //             .searchPatientName),
                                        //   ),
                                        // ),
                                        SizedBox(
                                          height: 10.0,
                                        ),
                                        // if (int.parse(patientType) == 7)
                                        // Container(
                                        //     padding: EdgeInsets.all(5),
                                        //     decoration: BoxDecoration(
                                        //         color: Colors.white,
                                        //         border: Border.all(
                                        //             color: Colors.grey),
                                        //         borderRadius:
                                        //             BorderRadius.circular(10)),
                                        //     child: ClinicList(
                                        //       clinicId: clinicId,
                                        //       onClinicChange: (newValue) {
                                        //         clinicId = newValue;
                                        //         changeClinic(
                                        //             newValue, context, model);
                                        //       },
                                        //     )),
                                        Padding(
                                          padding: EdgeInsets.only(
                                              top: MediaQuery.of(context)
                                                      .size
                                                      .height *
                                                  0.03),
                                          // child: _locationBar(context)
                                          child: SERVICES_PATIANT2[
                                                      int.parse(patientType)] ==
                                                  "List_MyOutPatient"
                                              ? _locationBar(context, model)
                                              : Container(),
                                        ),
                                        SizedBox(
                                          height: 10.0,
                                        ),
                                        Container(
                                            child: (responseModelList.length >
                                                    0)
                                                ? Column(
                                                    //  mainAxisAlignment: MainAxisAlignment.center,
                                                    children: responseModelList
                                                        .map((PatiantInformtion
                                                            item) {
                                                      return PatientCard(
                                                        patientInfo: item,
                                                        patientType:
                                                            patientType,
                                                        arrivalType:
                                                            arrivalType,
                                                        isInpatient:
                                                            isInpatient,
                                                        onTap: () {
                                                          Navigator.of(context)
                                                              .pushNamed(
                                                                  PATIENTS_PROFILE,
                                                                  arguments: {
                                                                "patient": item,
                                                                "patientType":
                                                                    patientType,
                                                                "from": patient
                                                                    .getFrom,
                                                                "to": patient
                                                                    .getTo,
                                                                "isSearch":
                                                                    isSearch,
                                                                "isInpatient":
                                                                    isInpatient,
                                                                "arrivalType":
                                                                    arrivalType,
                                                                "isInpatient":
                                                                    isInpatient
                                                              });
                                                        },
                                                      );
                                                    }).toList(),
                                                  )
                                                : Center(
                                                    child: Column(
                                                      crossAxisAlignment:
                                                          CrossAxisAlignment
                                                              .center,
                                                      children: [
                                                        SizedBox(
                                                          height: 100,
                                                        ),
                                                        Image.asset(
                                                            'assets/images/no-data.png'),
                                                        Padding(
                                                          padding:
                                                              const EdgeInsets
                                                                  .all(8.0),
                                                          child: AppText(
                                                              TranslationBase.of(
                                                                      context)
                                                                  .youDontHaveAnyPatient),
                                                        )
                                                      ],
                                                    ),
                                                  )),
                                      ],
                                    ),
                            )
                          ],
                        ),
                      ),
      ),
    );
  }

  changeClinic(clinicId, BuildContext context, model) async {
    GifLoaderDialogUtils.showMyDialog(context);
    Map profile = await sharedPref.getObj(DOCTOR_PROFILE);
    DoctorProfileModel doctorProfile = new DoctorProfileModel.fromJson(profile);
    ProfileReqModel docInfo = new ProfileReqModel(
        doctorID: doctorProfile.doctorID,
        clinicID: clinicId,
        license: true,
        projectID: doctorProfile.projectID,
        tokenID: '',
        languageID: 2);

    authProvider
        .getDocProfiles(docInfo.toJson(), allowChangeProfile: false)
        .then((profileList) async {
      print(profileList['DoctorProfileList'][0]);
      int val2 = int.parse(patientType);

      GetPatientArrivalListRequestModel getPatientArrivalListRequestModel =
          GetPatientArrivalListRequestModel(
              from: patient.From,
              to: patient.To,
              clinicID: profileList['DoctorProfileList'][0]['ClinicID'],
              doctorID:
                  profileList['DoctorProfileList'][0]['DoctorID'].toString(),
              patientMRN: patient.getPatientID,
              pageIndex: 0,
              pageSize: 0);

      model
          .getPatientList(
              getPatientArrivalListRequestModel.toJson(), patientType)
          .then((res) {
        setState(() {
          if (res != null && res['MessageStatus'] == 1) {
            if (val2 == 7) {
              if (res[SERVICES_PATIANT2[val2]] == null) {
                _isError = true;
                _isLoading = false;
                this.error = error.toString();
              } else {
                var localList = [];
                if (res["patientArrivalList"]["entityList"] == null) {
                  res["patientArrivalList"]["entityList"] = [];
                }
                res["patientArrivalList"]["entityList"].forEach((v) {
                  Map<String, dynamic> mergedPatient = {
                    ...v,
                    ...v["patientDetails"]
                  };
                  localList.add(mergedPatient);
                });
                lItems = localList;
              }
            }
            parsed = lItems;
            responseModelList = new ModelResponse.fromJson(parsed).list;
            responseModelList.sort((a, b) {
              DateTime now = DateTime.now();
              DateFormat dateFormat = DateFormat("yyyy-MM-dd HH:mm");
              String formattedDate =
                  DateFormat('yyyy-MM-dd ' + a.startTime).format(now);
              DateTime dateTimeA = dateFormat.parse(formattedDate);
              String formattedDateB =
                  DateFormat('yyyy-MM-dd ' + b.startTime).format(now);
              DateTime dateTimeB = dateFormat.parse(formattedDateB);
              var adate = dateTimeA; //a.startTime;
              var bdate = dateTimeB;
              return adate.compareTo(bdate);
            });
            responseModelList2 = responseModelList;
            _isError = false;
          } else {
            _isError = true;
            error = model.error ??
                res['ErrorEndUserMessage'] ??
                res['ErrorMessage'];
          }

          _isLoading = false;
        });
        GifLoaderDialogUtils.hideDialog(context);
      }).catchError((error) {
        Helpers.showErrorToast(error.toString());
        GifLoaderDialogUtils.hideDialog(context);
      });
    }).catchError((err) {
      GifLoaderDialogUtils.hideDialog(context);
      Helpers.showErrorToast(err);
    });
  }

  Widget _locationBar(BuildContext _context, model) {
    return Container(
      height: MediaQuery.of(context).size.height * 0.0619,
      width: SizeConfig.screenWidth * 0.94,
      decoration: BoxDecoration(
        color: Color(0Xffffffff),
        borderRadius: BorderRadius.circular(12.5),
        // border: Border.all(
        //   width: 0.5,
        // ),
      ),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        mainAxisSize: MainAxisSize.max,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: _locations.map((item) {
          bool _isActive = _locations[_activeLocation] == item ? true : false;
          return Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
            InkWell(
                child: Center(
                  child: Container(
                      height: MediaQuery.of(context).size.height * 0.058,
                      width: SizeConfig.screenWidth * 0.2334,
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.only(
                            bottomRight: Radius.circular(12.5),
                            topRight: Radius.circular(12.5),
                            topLeft: Radius.circular(9.5),
                            bottomLeft: Radius.circular(9.5)),
                        color: _isActive ? HexColor("#B8382B") : Colors.white,
                      ),
                      child: Center(
                        child: Text(
                          item,
                          style: TextStyle(
                            fontSize: 12,
                            color: _isActive
                                ? Colors.white
                                : Colors.black, //Colors.black,

                            fontWeight: FontWeight.normal,
                          ),
                        ),
                      )),
                ),
                onTap: () {
                  //filterBooking(item.toString());

                  setState(() {
                    _activeLocation = _locations.indexOf(item);
                  });
                  filterPatient(item.toString(), model);
                }),
            _isActive
                ? Container(
                    decoration: BoxDecoration(
                        borderRadius: BorderRadius.only(
                            bottomRight: Radius.circular(10),
                            topRight: Radius.circular(10)),
                        color: Colors.white),
                    alignment: Alignment.center,
                    height: 1,
                    width: SizeConfig.screenWidth * 0.23,
                  )
                : Container()
          ]);
        }).toList(),
      ),
    );
  }

  filterPatient(item, model) {
    if (item == 'Tomorrow') {
      _patientSearchFormValues.To = DateUtils.convertDateToFormat(
          DateTime(DateTime.now().year, DateTime.now().month,
              DateTime.now().day + 1),
          'yyyy-MM-dd');
      _patientSearchFormValues.From = DateUtils.convertDateToFormat(
          DateTime(DateTime.now().year, DateTime.now().month,
              DateTime.now().day + 1),
          'yyyy-MM-dd');
    } else if (item == 'Next Week') {
      _patientSearchFormValues.From = DateUtils.convertDateToFormat(
          DateTime(DateTime.now().year, DateTime.now().month,
              DateTime.now().day + 1),
          'yyyy-MM-dd');

      _patientSearchFormValues.To = DateUtils.convertDateToFormat(
          DateTime(DateTime.now().year, DateTime.now().month,
              DateTime.now().day + 6),
          'yyyy-MM-dd');
    } else {
      _patientSearchFormValues.From = DateUtils.convertDateToFormat(
          DateTime(
              DateTime.now().year, DateTime.now().month, DateTime.now().day),
          'yyyy-MM-dd');
      _patientSearchFormValues.To = DateUtils.convertDateToFormat(
          DateTime(
              DateTime.now().year, DateTime.now().month, DateTime.now().day),
          'yyyy-MM-dd');
    }
    searchPatient(model);
    // Navigator.of(context).pop();
    // Navigator.of(context).pushNamed(PATIENTS, arguments: {
    //   "patientSearchForm": _patientSearchFormValues,
    //   "selectedType": "7",
    //   "arrivalType": "1",
    //   "activeFilter": _activeLocation
    // });
  }

  searchPatient(model) {
    GifLoaderDialogUtils.showMyDialog(context);
    int val2 = int.parse(patientType);
    GetPatientArrivalListRequestModel getPatientArrivalListRequestModel;
    if (val2 == 0) {
      patient = PatientModel(
        From: _patientSearchFormValues.From,
        To: _patientSearchFormValues.To,
        FirstName: "0",
        MiddleName: "0",
        LastName: "0",
        PatientMobileNumber: "0",
        PatientIdentificationID: "0",
        PatientID: 0,
      );
    }

    model
        .getPatientList(
            val2 == 7 ? getPatientArrivalListRequestModel.toJson() : patient,
            patientType,
            isView: isView)
        .then((res) {
      setState(() {
        GifLoaderDialogUtils.hideDialog(context);
        if (res != null && res['MessageStatus'] == 1) {
          if (val2 == 7) {
            if (res[SERVICES_PATIANT2[val2]] == null) {
              _isError = true;
              _isLoading = false;
              this.error = error.toString();
            } else {
              var localList = [];
              if (res["patientArrivalList"]["entityList"] == null) {
                res["patientArrivalList"]["entityList"] = [];
              }
              res["patientArrivalList"]["entityList"].forEach((v) {
                Map<String, dynamic> mergedPatient = {
                  ...v,
                  ...v["patientDetails"]
                };
                localList.add(mergedPatient);
              });
              lItems = localList;
            }
          } else {
            if (isView == false && val2 == 1) {
              lItems = res['GetPatientFileInformation_PRMList']
                  .where((i) => i['PatientTypeDescription'] == 'Permanent File')
                  .toList();
            } else {
              lItems = res[SERVICES_PATIANT2[val2]];
            }
          }
          parsed = lItems;
          responseModelList = new ModelResponse.fromJson(parsed).list;
          if (val2 == 7) {
            responseModelList.sort((a, b) {
              if (b.startTime != null && b.startTime != null) {
                try {
                  DateTime now = DateTime.now();
                  DateFormat dateFormat = DateFormat("yyyy-MM-dd HH:mm");
                  String formattedDate =
                      DateFormat('yyyy-MM-dd ' + a.startTime).format(now);
                  DateTime dateTimeA = dateFormat.parse(formattedDate);
                  String formattedDateB =
                      DateFormat('yyyy-MM-dd ' + b.startTime).format(now);
                  DateTime dateTimeB = dateFormat.parse(formattedDateB);
                  var adate = dateTimeA; //a.startTime;
                  var bdate = dateTimeB;
                  return adate.compareTo(bdate);
                } on Exception catch (_) {
                  print('never reached');
                  var adate = a.startTime; //a.startTime;
                  var bdate = b.startTime;
                  return adate.compareTo(bdate);
                }
              } else {
                var adate = convertDateFormat(a.appointmentDate);
                var bdate = convertDateFormat(b.appointmentDate);
                return bdate.compareTo(adate);
              }
            });
          }
          responseModelList2 = responseModelList;
          _isError = false;
        } else {
          _isError = true;
          error =
              model.error ?? res['ErrorEndUserMessage'] ?? res['ErrorMessage'];
        }

        _isLoading = false;
      });
    }).catchError((error) {
      GifLoaderDialogUtils.hideDialog(context);
      setState(() {
        _isError = true;
        _isLoading = false;
        this.error = error.toString();
      });
    });
  }
}
