import "dart:collection";

import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart';
import 'package:diplomaticquarterapp/models/Appointments/SearchInfoModel.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/models/Clinics/ClinicListResponse.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/DentalComplaints.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/LaserBooking.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/SearchResults.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/dialog/clinic_list_dialog.dart';
import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/location_util.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/card/rounded_container.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'LaserClinic.dart';
import 'LiveCareBookAppointment.dart';

class SearchByClinic extends StatefulWidget {
  final List clnicIds;

  SearchByClinic({this.clnicIds});

  @override
  _SearchByClinicState createState() => _SearchByClinicState();
}

class _SearchByClinicState extends State<SearchByClinic> {
  bool nearestAppo = false;
  String dropdownValue;
  String dropdownTitle = "";
  String projectDropdownValue;

  // var event = RobotProvider();
  List<ListClinicCentralized> clinicsList = [];
  List<HospitalsModel> projectsList = [];
  bool isMobileAppDentalAllow = false;
  bool isLoaded = false;
  bool isProjectLoaded = false;

  ListClinicCentralized selectedClinic;
  HospitalsModel selectedHospital;

  AuthenticatedUser authUser = new AuthenticatedUser();
  AuthProvider authProvider = new AuthProvider();

  final GlobalKey clinicDropdownKey = GlobalKey();
  final GlobalKey projectDropdownKey = GlobalKey();
  TextEditingController ageController = new TextEditingController();
  ProjectViewModel projectViewModel;

  String radioValue = null;

  LocationUtils locationUtils;

  @override
  void initState() {
    locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context);
    WidgetsBinding.instance.addPostFrameCallback((_) => getClinicsList());
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    projectViewModel = Provider.of(context);
    if (projectViewModel.isLogin) {
      if (radioValue == null) {
        if (projectViewModel.user.gender == 1) {
          radioValue = TranslationBase.of(context).male;
        } else {
          radioValue = TranslationBase.of(context).female;
        }
      }
    } else if (radioValue == null) {
      radioValue = TranslationBase.of(context).female;
    }
    if (ageController.text.isEmpty) {
      ageController.text = projectViewModel.isLogin ? projectViewModel.user.age.toString() : "";
      ageController.selection = TextSelection.fromPosition(TextPosition(offset: ageController.text.length));
    }

    return Container(
      child: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            if (projectViewModel.isLogin)
              Column(
                children: [
                  Padding(
                    padding: const EdgeInsets.only(
                      left: 20,
                      right: 20,
                      top: 20,
                    ),
                    child: Text(
                      TranslationBase.of(context).doctorFilter,
                      style: TextStyle(
                        fontSize: 16,
                        fontWeight: FontWeight.w600,
                        letterSpacing: -0.64,
                      ),
                    ),
                  ),
                  mHeight(30),
                  Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Padding(
                        padding: const EdgeInsets.only(left: 20, right: 20),
                        child: Text(
                          TranslationBase.of(context).gender,
                          style: TextStyle(
                            fontSize: 12,
                            letterSpacing: -0.48,
                            color: Colors.black,
                            fontWeight: FontWeight.w600,
                          ),
                        ),
                      ),
                      Container(
                        padding: EdgeInsets.only(left: 6, right: 6),
                        child: Row(
                          children: [
                            Flexible(
                                child: Row(
                              children: [
                                Radio(
                                  value: TranslationBase.of(context).female,
                                  groupValue: radioValue,
                                  onChanged: (v) {
                                    setState(() {
                                      radioValue = v;
                                    });
                                  },
                                ),
                                Text(
                                  TranslationBase.of(context).female,
                                  style: TextStyle(
                                    fontSize: 12,
                                    letterSpacing: -0.48,
                                    fontWeight: FontWeight.w600,
                                  ),
                                ),
                              ],
                            )),
                            Flexible(
                                child: Row(
                              children: [
                                Radio(
                                  value: TranslationBase.of(context).male,
                                  groupValue: radioValue,
                                  onChanged: (v) {
                                    setState(() {
                                      radioValue = v;
                                    });
                                  },
                                ),
                                Text(
                                  TranslationBase.of(context).male,
                                  style: TextStyle(
                                    fontSize: 12,
                                    letterSpacing: -0.48,
                                    fontWeight: FontWeight.w600,
                                  ),
                                ),
                              ],
                            )),
                          ],
                        ),
                      ),
                    ],
                  ),
                  Container(
                    child: inputWidget("Age", "", ageController),
                    margin: EdgeInsets.only(left: 20, right: 20),
                  ),
                ],
              ),
            Padding(
              padding: const EdgeInsets.only(left: 6, right: 6, top: 16),
              child: Row(
                children: <Widget>[
                  Checkbox(
                    activeColor: CustomColors.accentColor,
                    value: nearestAppo,
                    onChanged: (bool value) {
                      setState(() {
                        nearestAppo = value;
                        if (nearestAppo)
                          getProjectsList();
                        else
                          isProjectLoaded = false;
                      });
                    },
                  ),
                  Text(TranslationBase.of(context).nearestAppo, style: TextStyle(fontSize: 14.0, letterSpacing: -0.56)),
                ],
              ),
            ),
            widget.clnicIds != null && widget.clnicIds.length > 1 && isLoaded == true
                ? Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: clinicsList.map<Widget>((result) {
                      return RoundedContainer(
                          child: ListTile(
                              onTap: () {
                                // setState(() {
                                dropdownValue = result.clinicID.toString();
                                setState(() {
                                  if (!isDentalSelectedAndSupported()) {
                                    dropdownValue = "";
                                    projectDropdownValue = "";
                                    getDoctorsList(context);
                                  } else {}
                                });
                              },
                              title: Text(result.clinicDescription, style: TextStyle(fontSize: 14.0, color: Colors.grey[700], letterSpacing: 1.0))));
                    }).toList())
                : InkWell(
                    onTap: () {
                      showClickListDialog(context, clinicsList, onSelection: (ListClinicCentralized clincs) {
                        selectedClinic = clincs;
                        Navigator.pop(context);
                        setState(() {
                          dropdownTitle = clincs.clinicDescription;
                          dropdownValue =
                              clincs.clinicID.toString() + "-" + clincs.isLiveCareClinicAndOnline.toString() + "-" + clincs.liveCareClinicID.toString() + "-" + clincs.liveCareServiceID.toString();
                          if (dropdownValue == "253-false-0-0") {
                            Navigator.push(context, FadePage(page: LaserClinic()));
                          } else if (!isDentalSelectedAndSupported()) {
                            projectDropdownValue = "";
                            if(!nearestAppo)
                              getDoctorsList(context);
                          } else {}
                        });
                        projectViewModel.analytics.appointment.book_appointment_select_clinic(appointment_type: 'regular', clinic: clincs.clinicDescription);
                      });
                    },
                    child: Container(
                      width: double.infinity,
                      decoration: containerRadius(Colors.white, 12),
                      margin: EdgeInsets.only(left: 20, right: 20),
                      padding: EdgeInsets.only(left: 10, right: 10, top: 12, bottom: 8),
                      child: Row(
                        children: [
                          Expanded(
                            child: Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                Text(
                                  TranslationBase.of(context).selectClinic,
                                  style: TextStyle(
                                    fontSize: 11,
                                    letterSpacing: -0.44,
                                    fontWeight: FontWeight.w600,
                                  ),
                                ),
                                Padding(
                                  padding: const EdgeInsets.only(top: 4, bottom: 2),
                                  child: Text(
                                    dropdownTitle,
                                    style: TextStyle(
                                      fontSize: 13,
                                      letterSpacing: -0.44,
                                      fontWeight: FontWeight.w600,
                                    ),
                                  ),
                                ),
                              ],
                            ),
                          ),
                          Icon(Icons.keyboard_arrow_down),
                        ],
                      ),
                    ),
                  ),
            mHeight(20),
            isDentalSelectedAndSupported() == true || (nearestAppo && isProjectLoaded)
                ? InkWell(
                    onTap: () {
                      openDropdown(projectDropdownKey);
                    },
                    child: Container(
                        width: double.infinity,
                        decoration: containerRadius(Colors.white, 12),
                        margin: EdgeInsets.only(left: 20, right: 20),
                        padding: EdgeInsets.only(left: 10, right: 10, top: 12, bottom: 12),
                        child: Row(
                          children: [
                            Flexible(
                              child: Column(
                                crossAxisAlignment: CrossAxisAlignment.start,
                                children: [
                                  Text(
                                    TranslationBase.of(context).selectHospital,
                                    style: TextStyle(
                                      fontSize: 11,
                                      letterSpacing: -0.44,
                                      fontWeight: FontWeight.w600,
                                    ),
                                  ),
                                  Container(
                                    height: 18,
                                    child: DropdownButtonHideUnderline(
                                      child: DropdownButton<HospitalsModel>(
                                        key: projectDropdownKey,
                                        hint: new Text(TranslationBase.of(context).selectHospital),
                                        value: selectedHospital,
                                        iconSize: 0,
                                        isExpanded: true,
                                        style: TextStyle(fontSize: 14, letterSpacing: -0.56, color: Colors.black),
                                        items: projectsList.map((item) {
                                          return new DropdownMenuItem<HospitalsModel>(
                                            value: item,
                                            child: new Text(item.name),
                                          );
                                        }).toList(),
                                        onChanged: (newValue) async {
                                          setState(() {
                                            selectedHospital = newValue;
                                            projectDropdownValue = newValue.mainProjectID.toString();
                                            getDoctorsList(context);
                                          });
                                        },
                                      ),
                                    ),
                                  ),
                                ],
                              ),
                            ),
                            Icon(Icons.keyboard_arrow_down),
                          ],
                        )),
                  )
                : Container(),
          ],
        ),
      ),
    );
  }

  Widget inputWidget(String _labelText, String _hintText, TextEditingController _controller, {String prefix, bool isEnable = true, bool hasSelection = false}) {
    return Container(
      padding: EdgeInsets.only(left: 16, right: 16, bottom: 15, top: 15),
      alignment: Alignment.center,
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(15),
        color: Colors.white,
        border: Border.all(
          color: Color(0xffefefef),
          width: 1,
        ),
      ),
      child: InkWell(
        onTap: hasSelection ? () {} : null,
        child: Row(
          children: [
            Expanded(
              child: Column(
                mainAxisSize: MainAxisSize.min,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text(
                    _labelText,
                    style: TextStyle(
                      fontSize: 11,
                      fontWeight: FontWeight.w600,
                      color: Color(0xff2B353E),
                      letterSpacing: -0.44,
                    ),
                  ),
                  TextField(
                    enabled: isEnable,
                    scrollPadding: EdgeInsets.zero,
                    keyboardType: TextInputType.number,
                    controller: _controller,
                    onChanged: (value) => {},
                    style: TextStyle(
                      fontSize: 14,
                      height: 21 / 14,
                      fontWeight: FontWeight.w400,
                      color: Color(0xff2B353E),
                      letterSpacing: -0.44,
                    ),
                    decoration: InputDecoration(
                      isDense: true,
                      hintText: _hintText,
                      hintStyle: TextStyle(
                        fontSize: 14,
                        height: 21 / 14,
                        fontWeight: FontWeight.w400,
                        color: Color(0xff575757),
                        letterSpacing: -0.56,
                      ),
                      prefixIconConstraints: BoxConstraints(minWidth: 50),
                      prefixIcon: prefix == null
                          ? null
                          : Text(
                              "+" + prefix,
                              style: TextStyle(
                                fontSize: 14,
                                height: 21 / 14,
                                fontWeight: FontWeight.w500,
                                color: Color(0xff2E303A),
                                letterSpacing: -0.56,
                              ),
                            ),
                      contentPadding: EdgeInsets.zero,
                      border: InputBorder.none,
                      focusedBorder: InputBorder.none,
                      enabledBorder: InputBorder.none,
                    ),
                  ),
                ],
              ),
            ),
            if (hasSelection) Icon(Icons.keyboard_arrow_down_outlined),
          ],
        ),
      ),
    );
  }

  void openDropdown(GlobalKey key) {
    GestureDetector detector;
    void searchForGestureDetector(BuildContext element) {
      element.visitChildElements((element) {
        if (element.widget != null && element.widget is GestureDetector) {
          detector = element.widget;
          return false;
        } else {
          searchForGestureDetector(element);
        }

        return true;
      });
    }

    searchForGestureDetector(key.currentContext);
    assert(detector != null);

    detector.onTap();
  }

  bool isDentalSelectedAndSupported() {
    if (dropdownValue != null)
      return dropdownValue != "" && (dropdownValue.split("-")[0] == "17") && isMobileAppDentalAllow;
    else
      return false;
  }

  getClinicsList() async {
    GifLoaderDialogUtils.showMyDialog(context);
    if (await sharedPref.getObject(CLINICS_LIST) != null) {
      dynamic res = await sharedPref.getObject(CLINICS_LIST);
      setState(() {
        isMobileAppDentalAllow = res['ISMobileAppDentalAllow'];
        res['ListClinicCentralized'].forEach((v) {
          clinicsList.add(new ListClinicCentralized.fromJson(v));
        });
      });
      getProjectsList();
      GifLoaderDialogUtils.hideDialog(context);
    } else {
      ClinicListService service = new ClinicListService();
      service.getClinicsList(context).then((res) {
        if (res['MessageStatus'] == 1) {
          setState(() {
            isMobileAppDentalAllow = res['ISMobileAppDentalAllow'];
            res['ListClinicCentralized'].forEach((v) {
              clinicsList.add(new ListClinicCentralized.fromJson(v));
            });
          });
          getProjectsList();
          GifLoaderDialogUtils.hideDialog(context);
        } else {}
      }).catchError((err) {
        print(err);
        GifLoaderDialogUtils.hideDialog(context);
      });
    }
  }

  getProjectsList() {
    ClinicListService service = new ClinicListService();
    List<HospitalsModel> projectsListLocal = [];
    service
        .getProjectsList(context)
        .then((res) {
          if (res['MessageStatus'] == 1) {
            setState(() {
              res['ListProject'].forEach((v) {
                projectsListLocal.add(new HospitalsModel.fromJson(v));
              });
              projectsList = projectsListLocal;
            });
            filterClinic();
            isProjectLoaded = true;
          } else {
            isProjectLoaded = false;
          }
          locationUtils.getCurrentLocation();
        })
        .catchError((err) {})
        .catchError((err) {
          print(err);
        });
  }

  // TODO Mosa_REMARk to come back later
  getDoctorsList(BuildContext context) {
    SearchInfo searchInfo = new SearchInfo();
    if (dropdownValue != null) if (dropdownValue.split("-")[0] == "17") {
      searchInfo.ProjectID = int.parse(projectDropdownValue);
      searchInfo.ClinicID = int.parse(dropdownValue.split("-")[0]);
      searchInfo.hospital = selectedHospital;
      searchInfo.clinic = selectedClinic;
      searchInfo.date = DateTime.now();

      if(projectViewModel.isLogin) {
        if(projectViewModel.user.age > 12) {
          navigateToDentalComplaints(context, searchInfo);
        } else {
          callDoctorsSearchAPI(17);
        }
      } else {
        navigateToDentalComplaints(context, searchInfo);
      }
    } else if (dropdownValue.split("-")[0] == "253") {
      navigateToLaserClinic(context);
      // callDoctorsSearchAPI();
    } else if (dropdownValue.split("-")[1] == "true"
        // && authProvider.isLogin &&
        // authUser.patientType == 1
        ) {
      Navigator.push(
        context,
        FadePage(
          page: LiveCareBookAppointment(clinicName: dropdownTitle, liveCareClinicID: dropdownValue.split("-")[2], liveCareServiceID: dropdownValue.split("-")[3]),
        ),
      ).then((value) {
        setState(() {
          if (value == "false") dropdownValue = null;
        });
        if (value == "livecare") {
          Navigator.push(context, FadePage(page: LiveCareHome()));
        }
        if (value == "schedule") {
          callDoctorsSearchAPI(int.parse(dropdownValue.split("-")[0]));
        }
      });
    } else {
      callDoctorsSearchAPI(int.parse(dropdownValue.split("-")[0]));
    }
  }

  callDoctorsSearchAPI(int clinicID) {
    GifLoaderDialogUtils.showMyDialog(context);
    List<DoctorList> doctorsList = [];
    List<String> arr = [];
    List<String> arrDistance = [];
    List<String> result;
    int numAll;
    List<PatientDoctorAppointmentList> _patientDoctorAppointmentListHospital = List();

    DoctorsListService service = new DoctorsListService();
    service.getDoctorsList(clinicID, projectDropdownValue != "" ? int.parse(projectDropdownValue) : 0, nearestAppo, context).then((res) {
      GifLoaderDialogUtils.hideDialog(context);
      if (res['MessageStatus'] == 1) {
        setState(() {
          if (res['DoctorList'].length != 0) {
            doctorsList.clear();
            res['DoctorList'].forEach((v) {
              doctorsList.add(new DoctorList.fromJson(v));
            });
            doctorsList.forEach((element) {
              List<PatientDoctorAppointmentList> doctorByHospital = _patientDoctorAppointmentListHospital
                  .where(
                    (elementClinic) => elementClinic.filterName == element.projectName,
                  )
                  .toList();

              if (doctorByHospital.length != 0) {
                _patientDoctorAppointmentListHospital[_patientDoctorAppointmentListHospital.indexOf(doctorByHospital[0])].patientDoctorAppointmentList.add(element);
              } else {
                _patientDoctorAppointmentListHospital
                    .add(PatientDoctorAppointmentList(filterName: element.projectName, distanceInKMs: element.projectDistanceInKiloMeters.toString(), patientDoctorAppointment: element));
              }
            });
          } else {}
        });

        result = LinkedHashSet<String>.from(arr).toList();
        numAll = result.length;
        navigateToSearchResults(context, doctorsList, _patientDoctorAppointmentListHospital);
      } else {
        AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
      }
    }).catchError((err) {
      GifLoaderDialogUtils.hideDialog(context);
      print(err);
      AppToast.showErrorToast(message: err);
    });
  }

  Future navigateToDentalComplaints(BuildContext context, SearchInfo searchInfo) async {
    Navigator.push(
      context,
      FadePage(
        page: DentalComplaints(searchInfo: searchInfo),
      ),
    ).then((value) {
      setState(() {
        dropdownValue = null;
      });
    });
  }

  Future navigateToLaserClinic(BuildContext context) async {
    Navigator.push(
      context,
      FadePage(
        page: LaserBooking(),
      ),
    ).then((value) {
      setState(() {
        dropdownValue = null;
      });
    });
  }

  Future navigateToSearchResults(context, List<DoctorList> docList, List<PatientDoctorAppointmentList> patientDoctorAppointmentListHospital) async {
    isProjectLoaded = false;
    Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital)))
        .then((value) {
      setState(() {
        dropdownValue = null;
        dropdownTitle = "";
      });
      getProjectsList();
    });
  }

  filterClinic() {
    setState(() {
      if (widget.clnicIds != null && widget.clnicIds.length > 0) {
        clinicsList = clinicsList.where((i) => widget.clnicIds.indexOf(i.clinicID) > -1).toList();
        isLoaded = true;
      }
    });
  }
}
