import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/er/PatientER.dart';
import 'package:diplomaticquarterapp/core/model/er/PatientER_RC.dart';
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/er/am_request_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart';
import 'package:diplomaticquarterapp/pages/Blood/dialogs/SelectHospitalDialog.dart';
import 'package:diplomaticquarterapp/pages/ErService/widgets/AppointmentCard.dart';
import 'package:diplomaticquarterapp/uitl/ProgressDialog.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/pickupLocation/PickupLocationFromMap.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_place_picker/google_maps_place_picker.dart';

import '../AvailableAppointmentsPage.dart';

enum HaveAppointment { YES, NO }

class PickupLocation extends StatefulWidget {
  final Function changeCurrentTab;
  final PatientER patientER;
  final PatientER_RC patientER_RC;
  final AmRequestViewModel amRequestViewModel;

  PickupLocation({Key key, this.changeCurrentTab, this.patientER, this.patientER_RC, this.amRequestViewModel});

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

class _PickupLocationState extends State<PickupLocation> {
  bool _isInsideHome = false;
  HaveAppointment _haveAppointment = HaveAppointment.NO;
  double _latitude;
  double _longitude;
  AppoitmentAllHistoryResultList myAppointment;
  HospitalsModel _selectedHospital;
  PickResult _result;

  @override
  void initState() {
    super.initState();
    _getCurrentLocation();
  }

  _getCurrentLocation() async {
    await getLastKnownPosition().then((value) {
      _latitude = value.latitude;
      _longitude = value.longitude;
    }).catchError((e) {
      _longitude = 0;
      _latitude = 0;
    });
  }

  @override
  Widget build(BuildContext context) {
    return AppScaffold(
      isShowAppBar: false,
      isShowDecPage: false,
      body: SingleChildScrollView(
        physics: BouncingScrollPhysics(),
        child: Container(
          margin: EdgeInsets.only(left: 12, right: 12),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              if (widget.patientER_RC.transportationDetails.direction == 1)
                Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Texts(TranslationBase.of(context).pickupLocation),
                    SizedBox(
                      height: 15,
                    ),
                    InkWell(
                      onTap: () {
                        Navigator.push(
                          context,
                          FadePage(
                              page: PickupLocationFromMap(
                            latitude: _latitude,
                            longitude: _longitude,
                            onPick: (value) {
                              setState(() {
                                _result = value;
                              });
                            },
                          )),
                        );
                      },
                      child: Container(
                        padding: EdgeInsets.all(12),
                        decoration: BoxDecoration(
                          shape: BoxShape.rectangle,
                          borderRadius: BorderRadius.circular(8),
                          border: Border.all(color: Colors.grey, width: 0.5),
                          color: Colors.white,
                        ),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: [
                            Expanded(child: Texts(getSelectFromMapName(context))),
                            Icon(
                              FontAwesomeIcons.mapMarkerAlt,
                              size: 24,
                              color: Colors.black,
                            )
                          ],
                        ),
                      ),
                    ),
                    SizedBox(
                      height: 12,
                    ),
                    Texts(TranslationBase.of(context).pickupSpot),
                    SizedBox(
                      height: 5,
                    ),
                    InkWell(
                      onTap: () {
                        setState(() {
                          _isInsideHome = !_isInsideHome;
                        });
                      },
                      child: Container(
                        decoration: BoxDecoration(
                          shape: BoxShape.rectangle,
                          borderRadius: BorderRadius.circular(8),
                          border: Border.all(color: Colors.grey, width: 0.5),
                          color: Colors.white,
                        ),
                        child: ListTile(
                          title: Texts(TranslationBase.of(context).insideHome),
                          leading: Checkbox(
                            value: _isInsideHome,
                            onChanged: (value) {
                              setState(() {
                                _isInsideHome = value;
                              });
                            },
                          ),
                        ),
                      ),
                    ),
                    SizedBox(
                      height: 12,
                    ),
                    Texts(TranslationBase.of(context).haveAppo),
                    SizedBox(
                      height: 5,
                    ),
                    Row(
                      children: [
                        Expanded(
                          child: InkWell(
                            onTap: () {
                              if (myAppointment == null) {
                                getAppointment();
                                setState(() {
                                  _haveAppointment = HaveAppointment.YES;
                                });
                              }
                            },
                            child: Container(
                              decoration: BoxDecoration(
                                shape: BoxShape.rectangle,
                                borderRadius: BorderRadius.circular(8),
                                border: Border.all(color: Colors.grey, width: 0.5),
                                color: Colors.white,
                              ),
                              child: ListTile(
                                title: Texts(TranslationBase.of(context).yes),
                                leading: Radio(
                                  value: HaveAppointment.YES,
                                  groupValue: _haveAppointment,
                                  onChanged: (value) {
                                    if (myAppointment == null) {
                                      getAppointment();
                                      setState(() {
                                        _haveAppointment = value;
                                      });
                                    }
                                  },
                                ),
                              ),
                            ),
                          ),
                        ),
                        Expanded(
                          child: InkWell(
                            onTap: () {
                              setState(() {
                                _haveAppointment = HaveAppointment.NO;
                                myAppointment = null;
                              });
                            },
                            child: Container(
                              decoration: BoxDecoration(
                                shape: BoxShape.rectangle,
                                borderRadius: BorderRadius.circular(8),
                                border: Border.all(color: Colors.grey, width: 0.5),
                                color: Colors.white,
                              ),
                              child: ListTile(
                                title: Texts(TranslationBase.of(context).no),
                                leading: Radio(
                                  value: HaveAppointment.NO,
                                  groupValue: _haveAppointment,
                                  onChanged: (value) {
                                    setState(() {
                                      _haveAppointment = value;
                                      myAppointment = null;
                                    });
                                  },
                                ),
                              ),
                            ),
                          ),
                        ),
                      ],
                    ),
                    if (myAppointment != null)
                      Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          SizedBox(
                            height: 12,
                          ),
                          AppointmentCard(
                            appointment: myAppointment,
                          )
                        ],
                      ),
                    SizedBox(
                      height: 12,
                    ),
                    Texts(TranslationBase.of(context).dropoffLocation),
                    SizedBox(
                      height: 8,
                    ),
                    InkWell(
                      onTap: () {
                        confirmSelectHospitalDialog(widget.amRequestViewModel.hospitals);
                      },
                      child: Container(
                        padding: EdgeInsets.all(12),
                        decoration: BoxDecoration(
                          shape: BoxShape.rectangle,
                          borderRadius: BorderRadius.circular(8),
                          border: Border.all(color: Colors.grey, width: 0.5),
                          color: Colors.white,
                        ),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: [
                            Texts(getHospitalName(TranslationBase.of(context).pickupLocation)),
                            Icon(
                              Icons.arrow_drop_down,
                              size: 24,
                              color: Colors.black,
                            )
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
              if (widget.patientER_RC.transportationDetails.direction == 0)
                Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Texts(TranslationBase.of(context).pickupLocation),
                    SizedBox(
                      height: 15,
                    ),
                    InkWell(
                      onTap: () {
                        confirmSelectHospitalDialog(widget.amRequestViewModel.hospitals);
                      },
                      child: Container(
                        padding: EdgeInsets.all(12),
                        decoration: BoxDecoration(
                          shape: BoxShape.rectangle,
                          borderRadius: BorderRadius.circular(8),
                          border: Border.all(color: Colors.grey, width: 0.5),
                          color: Colors.white,
                        ),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: [
                            Texts(getHospitalName(TranslationBase.of(context).pickupLocation)),
                            Icon(
                              Icons.arrow_drop_down,
                              size: 24,
                              color: Colors.black,
                            )
                          ],
                        ),
                      ),
                    ),
                    SizedBox(
                      height: 12,
                    ),
                    Texts(TranslationBase.of(context).dropoffLocation),
                    SizedBox(
                      height: 8,
                    ),
                    InkWell(
                      onTap: () {
                        Navigator.push(
                          context,
                          FadePage(
                            page: PickupLocationFromMap(
                              latitude: _latitude,
                              longitude: _longitude,
                              onPick: (value) {
                                setState(() {
                                  _result = value;
                                });
                              },
                            ),
                          ),
                        );
                      },
                      child: Container(
                        padding: EdgeInsets.all(12),
                        decoration: BoxDecoration(
                          shape: BoxShape.rectangle,
                          borderRadius: BorderRadius.circular(8),
                          border: Border.all(color: Colors.grey, width: 0.5),
                          color: Colors.white,
                        ),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: [
                            Expanded(child: Texts(getSelectFromMapName(context))),
                            Icon(
                              FontAwesomeIcons.mapMarkerAlt,
                              size: 24,
                              color: Colors.black,
                            )
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
              SizedBox(
                height: 45,
              ),
              if (myAppointment != null)
                SizedBox(
                  height: 100,
                ),
            ],
          ),
        ),
      ),
      bottomSheet: Container(
        padding: EdgeInsets.all(15),
        width: double.maxFinite,
        height: 90,
        child: SecondaryButton(
          color: Colors.grey[800],
          textColor: Colors.white,
          onTap: () {
            if (_result == null || _selectedHospital == null)
              AppToast.showErrorToast(message: TranslationBase.of(context).selectAll);
            else
              setState(() {
                widget.patientER_RC.transportationDetails.pickupSpot = _isInsideHome ? 1 : 0;
                if (widget.patientER_RC.transportationDetails.direction == 0) {
                  widget.patientER_RC.transportationDetails.dropoffLatitude = _result.geometry.location.lat.toString();
                  widget.patientER_RC.transportationDetails.dropoffLongitude = _result.geometry.location.lng.toString();
                  widget.patientER_RC.transportationDetails.pickupLatitude = _selectedHospital.latitude;
                  widget.patientER_RC.transportationDetails.pickupLongitude = _selectedHospital.longitude;
                } else {
                  widget.patientER_RC.transportationDetails.pickupLatitude = _selectedHospital.latitude;
                  widget.patientER_RC.transportationDetails.pickupLongitude = _selectedHospital.longitude;
                  widget.patientER_RC.transportationDetails.dropoffLatitude = _result.geometry.location.lat.toString();
                  widget.patientER_RC.transportationDetails.dropoffLongitude = _result.geometry.location.lng.toString();
                }

                // widget.patientER.latitude =
                //     widget.patientER.pickupLocationLattitude;
                // widget.patientER.longitude =
                //     widget.patientER.pickupLocationLongitude;

                widget.patientER_RC.transportationDetails.dropoffLocationName = widget.patientER.direction == 0 ? _result.formattedAddress : _selectedHospital.name;
                // widget.patientER_RC.crea =
                //     widget.amRequestViewModel.user.patientID;
                widget.patientER_RC.patientOutSA = widget.amRequestViewModel.user.outSA == 0 ? true : false;
                widget.patientER_RC.patientOutSa = widget.amRequestViewModel.user.outSA;

                widget.patientER_RC.patientIdentificationID = widget.amRequestViewModel.user.patientIdentificationNo;
                widget.patientER_RC.transportationDetails.pickupDateTime = DateUtil.convertDateToStringLocation(DateTime.now());
                widget.patientER_RC.transportationDetails.pickupLocationName = widget.patientER.direction == 0 ? _selectedHospital.name : _result.formattedAddress;
                widget.patientER_RC.projectID = widget.amRequestViewModel.user.projectID;
                widget.patientER_RC.patientID = widget.amRequestViewModel.user.patientID.toString();
                widget.patientER_RC.transportationDetails.requesterIsOutSA = false;
                // widget.patientER.lineItemNo = 0;
                widget.patientER_RC.transportationDetails.requesterMobileNo = widget.amRequestViewModel.user.mobileNumber;

                if (_haveAppointment == HaveAppointment.YES) {
                  widget.patientER_RC.transportationDetails.appointmentNo = myAppointment.appointmentNo.toString();
                  widget.patientER_RC.transportationDetails.appointmentClinicName = myAppointment.clinicName;
                  widget.patientER_RC.transportationDetails.appointmentDoctorName = myAppointment.doctorNameObj;
                  widget.patientER_RC.transportationDetails.appointmentBranch = myAppointment.projectName;
                  widget.patientER_RC.transportationDetails.appointmentTime = myAppointment.appointmentDate;
                  widget.patientER_RC.transportationDetails.haveAppointment = 1;
                } else {
                  widget.patientER_RC.transportationDetails.appointmentNo = "0";
                  widget.patientER_RC.transportationDetails.appointmentClinicName = "";
                  widget.patientER_RC.transportationDetails.appointmentDoctorName = "";
                  widget.patientER_RC.transportationDetails.appointmentBranch = "";
                  widget.patientER_RC.transportationDetails.appointmentTime = "";
                  widget.patientER_RC.transportationDetails.haveAppointment = 0;
                }

                widget.patientER_RC.transportationDetails.pickupSpot = _isInsideHome ? 1 : 0;
                widget.changeCurrentTab(2);
              });
          },
          label: TranslationBase.of(context).next,
        ),
      ),
    );
  }

  void confirmSelectHospitalDialog(List<HospitalsModel> hospitals) {
    showDialog(
      context: context,
      child: SelectHospitalDialog(
        hospitals: hospitals,
        selectedHospital: _selectedHospital,
        onValueSelected: (value) {
          setState(() {
            _selectedHospital = value;
          });
        },
      ),
    );
  }

  String getHospitalName(String title) {
    return _selectedHospital == null ? title : _selectedHospital.name;
  }

  String getSelectFromMapName(context) {
    return _result != null ? _result.formattedAddress : TranslationBase.of(context).selectMap;
  }

  getAppointment() {
    GifLoaderDialogUtils.showMyDialog(context);
    widget.amRequestViewModel.getAppointmentHistory().then((value) {
      if (widget.amRequestViewModel.state == ViewState.Error || widget.amRequestViewModel.state == ViewState.ErrorLocal) {
        AppToast.showErrorToast(message: widget.amRequestViewModel.error);
      } else if (widget.amRequestViewModel.appoitmentAllHistoryResultList.length > 0) {
        GifLoaderDialogUtils.hideDialog(context);
        Navigator.push(
          context,
          FadePage(
            page: AvailableAppointmentsPage(
              appointmentsAllHistoryList: widget.amRequestViewModel.appoitmentAllHistoryResultList,
            ),
          ),
        ).then((value) {
          if (value != null)
            setState(() {
              myAppointment = value;
            });
          else {
            ProgressDialogUtil.hideProgressDialog(context);
            setState(() {
              _haveAppointment = HaveAppointment.NO;
            });
          }
        });
      } else {
        GifLoaderDialogUtils.hideDialog(context);
        setState(() {
          _haveAppointment = HaveAppointment.NO;
        });
        AppToast.showErrorToast(message: TranslationBase.of(context).noAppointment);
      }
    }).catchError((e) {
      GifLoaderDialogUtils.hideDialog(context);
      AppToast.showErrorToast(message: e);
    });
  }
}
