import 'dart:io';

import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart';
import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/services/permission/permission_service.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/app_map/google_huawei_map.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

// import 'package:flutter_hms_gms_availability/flutter_hms_gms_availability.dart';
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:google_maps_place_picker_mb/google_maps_place_picker.dart';
import 'package:huawei_hmsavailability/huawei_hmsavailability.dart';
import 'package:provider/provider.dart';

class LocationPage extends StatefulWidget {
  final Function(PickResult) onPick;
  // final double latitude;
  // final double longitude;
  final dynamic model;

  const LocationPage({Key key, this.onPick, this.model}) : super(key: key);

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

class _LocationPageState extends State<LocationPage> {
  double latitude = 0;
  double longitude = 0;
  bool showCurrentLocation = false;

  GoogleMapController mapController;

  bool isHuawei = false;

  AppMap appMap;
  AppSharedPreferences sharedPref = AppSharedPreferences();
  static CameraPosition _kGooglePlex = CameraPosition(
    target: LatLng(37.42796133580664, -122.085749655962),
    zoom: 14.4746,
  );
  LatLng currentPostion;

  // Completer<GoogleMapController> mapController = Completer();
  Placemark selectedPlace;
  HmsApiAvailability hmsApiAvailability;
  ProjectViewModel projectViewModel;

  @override
  void initState() {
    hmsApiAvailability = HmsApiAvailability();
    if (latitude == 0.0 && longitude == 0.0) {
      showCurrentLocation = true;
    }
    if (Platform.isAndroid) checkIsHuawei();

    WidgetsBinding.instance.addPostFrameCallback((_) {
      latitude = projectViewModel.latitude;
      longitude = projectViewModel.longitude;
      appMap = AppMap(
        _kGooglePlex.toMap(),
        onCameraMove: (camera) {
          _updatePosition(camera);
        },
        onMapCreated: () {
          currentPostion = LatLng(projectViewModel.latitude, projectViewModel.longitude);
          latitude = projectViewModel.latitude;
          longitude = projectViewModel.longitude;
          _getUserLocation();
          setState(() {});
        },
        onCameraIdle: () async {
          List<Placemark> placemarks = await placemarkFromCoordinates(latitude, longitude);
          selectedPlace = placemarks[0];
          print(selectedPlace);
        },
      );
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    projectViewModel = Provider.of(context);
    return BaseView<HomeHealthCareViewModel>(
      onModelReady: (model) {},
      builder: (_, model, widget) => AppScaffold(
        appBarTitle: TranslationBase.of(context).addAddress,
        isShowDecPage: false,
        isShowAppBar: true,
        baseViewModel: model,
        showNewAppBarTitle: true,
        showNewAppBar: true,
        body: isHuawei
            ? Column(
                children: [
                  Expanded(
                    child: Stack(
                      alignment: Alignment.center,
                      children: [
                        if (appMap != null) appMap,
                        Container(
                          margin: EdgeInsets.only(bottom: 50.0),
                          child: Icon(
                            Icons.place,
                            color: CustomColors.accentColor,
                            size: 50,
                          ),
                        ),
                      ],
                    ),
                  ),
                  Container(
                    padding: const EdgeInsets.only(left: 20, right: 20, top: 14, bottom: 14),
                    child: DefaultButton(TranslationBase.of(context).addNewAddress, () async {
                      AddNewAddressRequestModel addNewAddressRequestModel = new AddNewAddressRequestModel(
                        customer: Customer(addresses: [
                          Addresses(
                              address1: selectedPlace.street,
                              address2: selectedPlace.street,
                              customerAttributes: "",
                              city: selectedPlace.administrativeArea,
                              createdOnUtc: "",
                              id: "0",
                              faxNumber: "",
                              phoneNumber: projectViewModel.user.mobileNumber,
                              province: selectedPlace.administrativeArea,
                              countryId: 69,
                              latLong: latitude.toStringAsFixed(6) + "," + longitude.toStringAsFixed(6),
                              country: selectedPlace.country,
                              zipPostalCode: selectedPlace.postalCode,
                              email: projectViewModel.user.emailAddress)
                        ]),
                      );
                      await model.addAddressInfo(addNewAddressRequestModel: addNewAddressRequestModel);
                      if (model.state == ViewState.ErrorLocal) {
                        Utils.showErrorToast(model.error);
                      } else {
                        AppToast.showSuccessToast(message: "Address Added Successfully");
                      }
                      Navigator.of(context).pop(addNewAddressRequestModel);
                    }),
                  ),
                ],
              )
            : PlacePicker(
                apiKey: GOOGLE_API_KEY,
                enableMyLocationButton: true,
                automaticallyImplyAppBarLeading: false,
                autocompleteOnTrailingWhitespace: true,
                selectInitialPosition: true,
                autocompleteLanguage: projectViewModel.currentLanguage,
                enableMapTypeButton: true,
                searchForInitialValue: false,
                onMapCreated: (GoogleMapController controller) {
                  mapController = controller;
                },
                onPlacePicked: (PickResult result) {
                  print(result.adrAddress);
                },
                selectedPlaceWidgetBuilder: (_, selectedPlace, state, isSearchBarFocused) {
                  print("state: $state, isSearchBarFocused: $isSearchBarFocused");
                  return isSearchBarFocused
                      ? Container()
                      : FloatingCard(
                          bottomPosition: 0.0,
                          leftPosition: 0.0,
                          rightPosition: 0.0,
                          width: 500,
                          borderRadius: BorderRadius.circular(0.0),
                          child: state == SearchingState.Searching
                              ? SizedBox(height: 43, child: Center(child: CircularProgressIndicator())).insideContainer
                              : DefaultButton(TranslationBase.of(context).addNewAddress, () async {
                                  AddNewAddressRequestModel addNewAddressRequestModel = new AddNewAddressRequestModel(
                                    customer: Customer(addresses: [
                                      Addresses(
                                          address1: selectedPlace.formattedAddress,
                                          address2: selectedPlace.formattedAddress,
                                          customerAttributes: "",
                                          createdOnUtc: "",
                                          id: "0",
                                          faxNumber: "",
                                          phoneNumber: projectViewModel.user.mobileNumber,
                                          countryId: 69,
                                          latLong: selectedPlace.geometry.location.lat.toString() + "," + selectedPlace.geometry.location.lng.toString(),
                                          email: projectViewModel.user.emailAddress)
                                    ]),
                                  );

                                  selectedPlace.addressComponents.forEach((e) {
                                    if (e.types.contains("country")) {
                                      addNewAddressRequestModel.customer.addresses[0].country = e.longName;
                                    }
                                    if (e.types.contains("postal_code")) {
                                      addNewAddressRequestModel.customer.addresses[0].zipPostalCode = e.longName;
                                    }
                                    if (e.types.contains("locality")) {
                                      addNewAddressRequestModel.customer.addresses[0].city = e.longName;
                                    }
                                  });

                                  await model.addAddressInfo(addNewAddressRequestModel: addNewAddressRequestModel);
                                  if (model.state == ViewState.ErrorLocal) {
                                    Utils.showErrorToast(model.error);
                                  } else {
                                    AppToast.showSuccessToast(message: "Address Added Successfully");
                                  }
                                  Navigator.of(context).pop(addNewAddressRequestModel);
                                }).insideContainer);
                },
                initialPosition: LatLng(latitude, longitude),
                useCurrentLocation: showCurrentLocation,
              ),
      ),
    );
  }

  checkIsHuawei() async {
    // isHuawei = await FlutterHmsGmsAvailability.isHmsAvailable;
    // print(isHuawei);
    // setState(() {});
    await hmsApiAvailability.isHMSAvailable().then((value) {
      isHuawei = value == 0 ? true : false;
    });
    print(isHuawei);
    setState(() {});
  }

  void _getUserLocation() async {
    if (await this.sharedPref.getDouble(USER_LAT) != null && await this.sharedPref.getDouble(USER_LONG) != null) {
      var lat = await this.sharedPref.getDouble(USER_LAT);
      var long = await this.sharedPref.getDouble(USER_LONG);
      latitude = lat;
      longitude = long;
      currentPostion = LatLng(lat, long);
      setMap();
    } else {
      if (await PermissionService.isLocationEnabled()) {
        Geolocator.getLastKnownPosition().then((value) {
          latitude = value.latitude;
          longitude = value.longitude;
          currentPostion = LatLng(latitude, longitude);
          setMap();
        });
      } else {
        if (Platform.isAndroid) {
          Utils.showPermissionConsentDialog(context, TranslationBase.of(context).locationPermissionDialog, () {
            Geolocator.getLastKnownPosition().then((value) {
              latitude = value.latitude;
              longitude = value.longitude;
              currentPostion = LatLng(latitude, longitude);
              setMap();
            });
          });
        } else {
          Geolocator.getLastKnownPosition().then((value) {
            latitude = value.latitude;
            longitude = value.longitude;
            setMap();
          });
        }
      }
    }
  }

  setMap() {
    setState(() {
      _kGooglePlex = CameraPosition(
        target: currentPostion,
        zoom: 14.4746,
      );
      appMap.moveTo(cameraPostion: _kGooglePlex);
    });
  }

  void _updatePosition(CameraPosition _position) {
    print(_position);
    latitude = _position.target.latitude;
    longitude = _position.target.longitude;
  }
}
