import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/er/PatientER.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/pages/landing/home_page.dart';
import 'package:diplomaticquarterapp/uitl/ProgressDialog.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.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 'package:google_maps_flutter/google_maps_flutter.dart';

import '../AmbulanceReq.dart';
import '../AvailableAppointmentsPage.dart';

enum HaveAppointment { YES, NO }

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

  PickupLocation(
      {Key key,
      this.changeCurrentTab,
      this.patientER,
      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;
    });
    //   currentLocation = LatLng(position.latitude, position.longitude);
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      physics: BouncingScrollPhysics(),
      child: Container(
        margin: EdgeInsets.only(left: 12, right: 12),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            if (widget.patientER.direction == 1)
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Texts('Pickup Location'),
                  SizedBox(
                    height: 15,
                  ),
                  InkWell(
                    onTap: (){
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => 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: [
                          Texts(getSelectFromMapName()),
                          Icon(
                            FontAwesomeIcons.mapMarkerAlt,
                            size: 24,
                            color: Colors.black,
                          )
                        ],
                      ),
                    ),
                  ),
                  SizedBox(
                    height: 12,
                  ),
                  Texts('Pickup Spot'),
                  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('Inside Home'),
                        leading: Checkbox(
                          activeColor: Colors.red[800],
                          value: _isInsideHome,
                          onChanged: (value) {
                            setState(() {
                              _isInsideHome = value;
                            });
                          },
                        ),
                      ),
                    ),
                  ),
                  SizedBox(
                    height: 12,
                  ),
                  Texts('Do you have an appointment ?'),
                  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: Text('Yes'),
                              leading: Radio(
                                value: HaveAppointment.YES,
                                groupValue: _haveAppointment,
                                activeColor: Colors.red[800],
                                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: Text('No'),
                              leading: Radio(
                                value: HaveAppointment.NO,
                                groupValue: _haveAppointment,
                                activeColor: Colors.red[800],
                                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('Drop off Location'),
                  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('Pickup Location')),
                          Icon(
                            Icons.arrow_drop_down,
                            size: 24,
                            color: Colors.black,
                          )
                        ],
                      ),
                    ),
                  ),
                ],
              ),
            if (widget.patientER.direction == 0)
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Texts('Pickup Location'),
                  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('Pickup Location')),
                          Icon(
                            Icons.arrow_drop_down,
                            size: 24,
                            color: Colors.black,
                          )
                        ],
                      ),
                    ),
                  ),
                  SizedBox(
                    height: 12,
                  ),
                  Texts('Drop off Location'),
                  SizedBox(
                    height: 8,
                  ),
                  InkWell(
                    onTap: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => 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: [
                          Texts(getSelectFromMapName()),
                          Icon(
                            FontAwesomeIcons.mapMarkerAlt,
                            size: 24,
                            color: Colors.black,
                          )
                        ],
                      ),
                    ),
                  ),
                ],
              ),
            //TODO show dialog projects

            SizedBox(
              height: 45,
            ),
            Container(
              padding: EdgeInsets.all(15),
              width: double.maxFinite,
              height: 76,
              child: SecondaryButton(
                color: Colors.grey[800],
                textColor: Colors.white,
                onTap: () {
                  if (_result == null || _selectedHospital == null)
                    AppToast.showErrorToast(
                        message: 'please select all fields');
                  else
                    setState(() {
                      widget.patientER.pickupSpot = _isInsideHome ? 1 : 0;
                      if (widget.patientER.direction == 0) {
                        widget.patientER.pickupLocationLattitude = _result.geometry.location.lat.toString();
                        widget.patientER.pickupLocationLongitude = _result.geometry.location.lng.toString();
                        widget.patientER.dropoffLocationLattitude = _selectedHospital.latitude;
                        widget.patientER.dropoffLocationLongitude = _selectedHospital.longitude;
                      } else {
                        widget.patientER.pickupLocationLattitude = _selectedHospital.latitude;
                        widget.patientER.pickupLocationLongitude = _selectedHospital.longitude;
                        widget.patientER.dropoffLocationLattitude = _result.geometry.location.lat.toString();
                        widget.patientER.dropoffLocationLongitude = _result.geometry.location.lng.toString();
                      }

                      widget.patientER.latitude = widget.patientER.pickupLocationLattitude;
                      widget.patientER.longitude = widget.patientER.pickupLocationLongitude;
                      widget.patientER.dropoffLocationName  = _selectedHospital.name;
                      widget.patientER.createdBy = widget.amRequestViewModel.user.patientID;
                      widget.patientER.isOutPatient = widget.amRequestViewModel.user.outSA;
                      widget.patientER.patientIdentificationID = widget.amRequestViewModel.user.patientIdentificationNo;
                      widget.patientER.pickupDateTime = DateUtil.convertDateToStringLocation(DateTime.now());
                      widget.patientER.pickupLocationName = _result.formattedAddress;
                      widget.patientER.projectID = widget.amRequestViewModel.user.projectID;
                      widget.patientER.requesterFileNo = widget.amRequestViewModel.user.patientID;
                      widget.patientER.requesterIsOutSA = false;
                      widget.patientER.lineItemNo =0;
                      widget.patientER.requesterMobileNo = widget.amRequestViewModel.user.mobileNumber;

                      if (_haveAppointment == HaveAppointment.YES) {
                        widget.patientER.appointmentNo = myAppointment.appointmentNo.toString();
                        widget.patientER.appointmentClinicName = myAppointment.clinicName;
                        widget.patientER.appointmentDoctorName = myAppointment.doctorNameObj;
                        widget.patientER.appointmentBranch = myAppointment.projectName;
                        widget.patientER.appointmentTime = myAppointment.appointmentDate;
                        widget.patientER.haveAppointment = true;
                      } else {
                        widget.patientER.appointmentNo = "0";
                        widget.patientER.appointmentClinicName = null;
                        widget.patientER.appointmentDoctorName = null;
                        widget.patientER.appointmentBranch = null;
                        widget.patientER.appointmentTime = null;
                        widget.patientER.haveAppointment = false;
                      }

                      widget.patientER.pickupSpot = _isInsideHome ? 1 : 0;
                      widget.changeCurrentTab(2);
                    });
                },
                label: '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() {
    return _result != null ? _result.formattedAddress : 'Select From Map';
  }

  getAppointment() {
    ProgressDialogUtil.showProgressDialog(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) {
        ProgressDialogUtil.hideProgressDialog(context);
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => AvailableAppointmentsPage(
              appointmentsAllHistoryList:
                  widget.amRequestViewModel.appoitmentAllHistoryResultList,
            ),
          ),
        ).then((value) {
          if (value != null)
            setState(() {
              myAppointment = value;
            });
          else {
            ProgressDialogUtil.hideProgressDialog(context);
            setState(() {
              _haveAppointment = HaveAppointment.NO;
            });
          }
        });
      } else {
        ProgressDialogUtil.hideProgressDialog(context);
        setState(() {
          _haveAppointment = HaveAppointment.NO;
        });
        AppToast.showErrorToast(message: 'You don\'t have any appointment');
      }
    }).catchError((e) {
      ProgressDialogUtil.hideProgressDialog(context);
      AppToast.showErrorToast(message: e);
    });
  }
}
