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/Clinics/ClinicListResponse.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/DentalComplaints.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:flutter/material.dart';
import 'package:smart_progress_bar/smart_progress_bar.dart';

class SearchByClinic extends StatefulWidget {
  @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;

  @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(0xFFc5272d),
                value: nearestAppo,
                onChanged: (bool value) {
                  setState(() {
                    nearestAppo = value;
                  });
                },
              ),
              Text(TranslationBase.of(context).nearestAppo,
                  style: TextStyle(fontSize: 16.0, letterSpacing: 0.9)),
            ],
          ),
          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("Select Clinic"),
                  value: dropdownValue,
                  items: clinicsList.map((item) {
                    return new DropdownMenuItem<String>(
                      value: item.clinicID.toString(),
                      child: new Text(item.clinicDescription),
                    );
                  }).toList(),
                  onChanged: (newValue) {
                    setState(() {
                      dropdownValue = newValue;
                      if (!isDentalSelectedAndSupported() && !nearestAppo) {
                        projectDropdownValue = "";
                        getDoctorsList(context);
                      }
                    });
                  },
                ),
              )),
          isDentalSelectedAndSupported() == true || nearestAppo
              ? 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() {
    return dropdownValue != "" &&
        (dropdownValue == "17") &&
        isMobileAppDentalAllow;
  }

  getClinicsList() {
    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));
              });
            });
          } else {}
        })
        .catchError((err) {
          print(err);
        })
        .showProgressBar(
            text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6))
        .then((value) {
          getProjectsList();
        });
  }

  getProjectsList() {
    ClinicListService service = new ClinicListService();
    service.getProjectsList(context).then((res) {
      if (res['MessageStatus'] == 1) {
        setState(() {
          res['ListProject'].forEach((v) {
            projectsList.add(new HospitalsModel.fromJson(v));
          });
          print(projectsList.length);
        });
      } else {}
    }).catchError((err) {
      print(err);
    }).showProgressBar(
        text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6));
  }

  getDoctorsList(BuildContext context) {
    SearchInfo searchInfo = new SearchInfo();
    if (dropdownValue == "17") {
      searchInfo.ProjectID = int.parse(projectDropdownValue);
      searchInfo.ClinicID = int.parse(dropdownValue);
      searchInfo.date = DateTime.now();

      navigateToDentalComplaints(context, searchInfo);
    } else {
      List<DoctorList> doctorsList = [];
      List<String> arr = [];
      List<String> arrDistance = [];
      List<String> result;
      int numAll;
      DoctorsListService service = new DoctorsListService();
      service
          .getDoctorsList(
              int.parse(dropdownValue),
              projectDropdownValue != "" ? int.parse(projectDropdownValue) : 0,
              nearestAppo,
              context)
          .then((res) {
        if (res['MessageStatus'] == 1) {
          setState(() {
            if (res['DoctorList'].length != 0) {
              print(res['DoctorList']);
              doctorsList.clear();
              res['DoctorList'].forEach((v) {
                doctorsList.add(new DoctorList.fromJson(v));

                arr.add(new DoctorList.fromJson(v).projectName);
                arrDistance.add(new DoctorList.fromJson(v)
                    .projectDistanceInKiloMeters
                    .toString());
              });
            } else {}
          });

          result = LinkedHashSet<String>.from(arr).toList();
          numAll = result.length;

          navigateToSearchResults(
              context, doctorsList, result, numAll, arrDistance);
        } else {
          AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
        }
      }).catchError((err) {
        print(err);
        AppToast.showErrorToast(message: err);
      }).showProgressBar(
              text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6));
    }
  }

  Future navigateToDentalComplaints(
      BuildContext context, SearchInfo searchInfo) async {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => DentalComplaints(searchInfo: searchInfo),
      ),
    );
  }

  Future navigateToSearchResults(
      context, docList, result, numAll, resultDistance) async {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => BranchView(
            doctorsList: docList,
            result: result,
            num: numAll,
            resultDistance: resultDistance),
      ),
    ).then((value) {
      getProjectsList();
    });
  }
}
