import 'package:diplomaticquarterapp/config/config.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/cmc_view_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/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:google_maps_place_picker/google_maps_place_picker.dart';
import 'package:provider/provider.dart';

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

  const CMCLocationPage(
      {Key key, this.onPick, this.latitude, this.longitude, this.model})
      : super(key: key);

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

class _CMCLocationPageState extends State<CMCLocationPage> {
  double latitude = 0;
  double longitude = 0;
  bool showCurrentLocation = false;

  @override
  void initState() {
    latitude = widget.latitude;
    longitude = widget.longitude;
    if(latitude == 0.0 && longitude == 0.0) {
      showCurrentLocation = true;
    }
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    ProjectViewModel projectViewModel = Provider.of(context);
    return BaseView<CMCViewModel>(
        onModelReady: (model) {},
        builder: (_, model, widget) => AppScaffold(
              isShowDecPage: false,
              isShowAppBar: true,
              baseViewModel: model,
              body: PlacePicker(
                apiKey: GOOGLE_API_KEY,
                enableMyLocationButton: true,
                automaticallyImplyAppBarLeading: false,
                autocompleteOnTrailingWhitespace: true,
                selectInitialPosition: true,
                autocompleteLanguage: projectViewModel.currentLanguage,
                enableMapTypeButton: true,
                searchForInitialValue: false,
                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(12.0),
                          child: state == SearchingState.Searching
                              ? Center(child: CircularProgressIndicator())
                              : Container(
                                  margin: EdgeInsets.all(12),
                                  child: Column(
                                    children: [
                                      SecondaryButton(
                                        color: Colors.grey[800],
                                        textColor: Colors.white,
                                        onTap: () async {
                                          print(selectedPlace);
                                          AddNewAddressRequestModel
                                              addNewAddressRequestModel =
                                              new AddNewAddressRequestModel(
                                            customer: Customer(addresses: [
                                              Addresses(
                                                  address1: selectedPlace
                                                      .formattedAddress,
                                                  address2: selectedPlace
                                                      .formattedAddress,
                                                  customerAttributes: "",
                                                  city: "",
                                                  createdOnUtc: "",
                                                  id: 0,
                                                  latLong:
                                                      "$latitude,$longitude",
                                                  email: "")
                                            ]),
                                          );

                                          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();
                                        },
                                        label: TranslationBase.of(context)
                                            .addNewAddress,
                                      ),
                                    ],
                                  ),
                                ),
                        );
                },
                initialPosition: LatLng(latitude, longitude),
                useCurrentLocation: showCurrentLocation,
              ),
            ));
  }
}
