import "dart:collection";

import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_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/SearchResults.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/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/card/rounded_container.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.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 projectDropdownValue;

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

  ListClinicCentralized selectedClinic;

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

  @override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((_) => getClinicsList());
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.all(10.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Row(
            children: <Widget>[
              Checkbox(
                activeColor: new Color(0xFF40ACC9),
                value: nearestAppo,
                onChanged: (bool value) {
                  setState(() {
                    nearestAppo = value;
                    print(nearestAppo);
                    if (nearestAppo)
                      getProjectsList();
                    else
                      isProjectLoaded = false;
                  });
                },
              ),
              Text(TranslationBase.of(context).nearestAppo, style: TextStyle(fontSize: 16.0, letterSpacing: 0.9)),
            ],
          ),
          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()) {
                                  projectDropdownValue = "";
                                  getDoctorsList(context);
                                } else {}
                              });
                            },
                            title: Text(result.clinicDescription, style: TextStyle(fontSize: 14.0, color: Colors.grey[700], letterSpacing: 1.0))));
                  }).toList())
              : Container(
                  height: 60.0,
                  decoration: BoxDecoration(
                    color: Colors.white,
                    border: Border.all(
                      color: Colors.grey[400],
                      width: 1.0,
                    ),
                    borderRadius: BorderRadius.circular(10),
                  ),
                  // margin: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 20.0),
                  padding: EdgeInsets.all(8.0),
                  width: MediaQuery.of(context).size.width,
                  child: DropdownButtonHideUnderline(
                    child: DropdownButton<String>(
                      hint: new Text(TranslationBase.of(context).selectClinic),
                      value: dropdownValue,
                      items: clinicsList.map((item) {
                        return new DropdownMenuItem<String>(
                          value: item.clinicID.toString() + "-" + item.isLiveCareClinicAndOnline.toString() + "-" + item.liveCareClinicID.toString() + "-" + item.liveCareServiceID.toString(),
                          child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
                            Text(item.clinicDescription),
                            item.isLiveCareClinicAndOnline ? SvgPicture.asset('assets/images/new-design/video_icon_green_right.svg', height: 15, width: 15, fit: BoxFit.cover) : Container(),
                          ]),
                        );
                      }).toList(),
                      onChanged: (newValue) {
                        setState(() {
                          print(newValue);
                          dropdownValue = newValue;
                          if (!isDentalSelectedAndSupported() && !nearestAppo) {
                            projectDropdownValue = "";
                            getDoctorsList(context);
                          } else {
                            print("Dental");
                          }
                        });
                      },
                    ),
                  )),
          isDentalSelectedAndSupported() == true || (nearestAppo && isProjectLoaded)
              ? Container(
                  height: 60.0,
                  decoration: BoxDecoration(
                    color: Colors.white,
                    border: Border.all(
                      color: Colors.grey[400],
                      width: 1.0,
                    ),
                    borderRadius: BorderRadius.circular(10),
                  ),
                  padding: EdgeInsets.all(8.0),
                  width: MediaQuery.of(context).size.width,
                  margin: EdgeInsets.only(top: 15.0),
                  child: DropdownButtonHideUnderline(
                    child: DropdownButton<String>(
                      hint: new Text("Select Project"),
                      value: projectDropdownValue,
                      items: projectsList.map((item) {
                        return new DropdownMenuItem<String>(
                          value: item.mainProjectID.toString(),
                          child: new Text(item.name),
                        );
                      }).toList(),
                      onChanged: (newValue) {
                        setState(() {
                          projectDropdownValue = newValue;
                          getDoctorsList(context);
                        });
                      },
                    ),
                  ))
              : Container(),
        ],
      ),
    );
  }

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

  getClinicsList() {
    GifLoaderDialogUtils.showMyDialog(context);
    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;
      }
    }).catchError((err) {
      print(err);
    });
  }

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

      navigateToDentalComplaints(context, searchInfo);
    } else if (dropdownValue.split("-")[1] == "true"
        // && authProvider.isLogin &&
        // authUser.patientType == 1
        ) {
      Navigator.push(
        context,
        FadePage(
          page: LiveCareBookAppointment(clinicName: "Family Medicine", liveCareClinicID: dropdownValue.split("-")[2], liveCareServiceID: dropdownValue.split("-")[3]),
        ),
      ).then((value) {
        print(value);
        if (value == "false") dropdownValue = "";
        if (value == "livecare") {
          Navigator.push(context, FadePage(page: LiveCareHome()));
        }
        if (value == "schedule") {
          callDoctorsSearchAPI();
        }
      });
    } else {
      callDoctorsSearchAPI();
    }
  }

  callDoctorsSearchAPI() {
    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(int.parse(dropdownValue.split("-")[0]), 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),
      ),
    );
  }

  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) {
      getProjectsList();
    });
  }

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