import 'dart:async';
import 'dart:developer';

import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';

import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';

import 'package:permission_handler/permission_handler.dart';

import 'map_selection_widget.dart';
import 'package:geocoding/geocoding.dart';

class PickLocationPage extends StatefulWidget {
  final Function(double, double, String) onPickAddress;

  const PickLocationPage({super.key, required this.onPickAddress});

  @override
  State<PickLocationPage> createState() => _PickLocationPageState();
}

class _PickLocationPageState extends State<PickLocationPage> {
  double latitude = 0;
  double longitude = 0;

  final Set<Marker> markers = {};
  late AppMap appMap;

  static CameraPosition _kGooglePlex = CameraPosition(target: AppState().currentLocation, zoom: 14.4746);
  late LatLng currentPosition;
  Completer<GoogleMapController> mapController = Completer();
  final ValueNotifier<String> _counter = ValueNotifier<String>("");

  @override
  void initState() {
    appMap = AppMap(
      _kGooglePlex.toMap() as Map,
      onCameraMove: (camera) {
        _updatePosition(camera);
      },
      onCameraIdle: () {
        updateAddress(latitude, longitude);
      },
      onMapCreated: () {
        // goToCurrentLocation();
        _getUserLocation();
        setState(() {});
      },
    );
    super.initState();
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: CustomAppBar(
        title: LocaleKeys.pickLocation.tr(),
        isRemoveBackButton: false,
      ),
      body: Column(
        children: [
          Expanded(
            child: Stack(
              children: [
                if (appMap != null) appMap,
                ValueListenableBuilder<String>(
                  builder: (BuildContext context, String value, Widget? child) {
                    // This builder will only get called when the _counter
                    // is updated.
                    return value.isNotEmpty
                        ? Container(
                            width: double.infinity,
                            margin: const EdgeInsets.all(12),
                            child: Card(
                                child: Padding(
                              padding: const EdgeInsets.all(12.0),
                              child: Text(value ?? ""),
                            )),
                          )
                        : Container();
                  },
                  valueListenable: _counter,
                ),
                const Align(
                  alignment: Alignment.center,
                  child: Icon(
                    Icons.place,
                    color: Colors.red,
                    size: 50,
                  ),
                ),
              ],
            ),
          ),
          SizedBox(
            width: double.infinity,
            child: Padding(
              padding: const EdgeInsets.all(12.0),
              child: ShowFillButton(
                maxHeight: 55,
                title: LocaleKeys.pickAddress.tr(),
                onPressed: () {
                  widget.onPickAddress(latitude, longitude, _counter.value);
                  pop(context);
                },
              ),
            ),
          ),
        ],
      ),
    );
  }

  Future<void> _updatePosition(CameraPosition position) async {
    latitude = position.target.latitude;
    longitude = position.target.longitude;
    log(latitude.toString());
    log(latitude.toString());
    // updateAddress(latitude, longitude);
  }

  void _getUserLocation() async {
    if (await Permission.location.request().isGranted) {
      var position = await GeolocatorPlatform.instance.getCurrentPosition();
      currentPosition = LatLng(position.latitude, position.longitude);
      latitude = position.latitude;
      longitude = position.longitude;
      setMap();
      updateAddress(latitude, longitude);
    } else {
      requestPermissions().then(
        (value) async {
          if (value[Permission.location]!.isGranted) {
            var position = await GeolocatorPlatform.instance.getCurrentPosition();
            currentPosition = LatLng(position.latitude, position.longitude);
            latitude = position.latitude;
            longitude = position.longitude;
            setMap();
            updateAddress(latitude, longitude);
          }
        },
      );
    }
    setState(() {});
  }

  updateAddress(double latitude, double longitude) async {
    List<Placemark> placemarks = await placemarkFromCoordinates(latitude, longitude);
    _counter.value = '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}';
  }

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

  Future<String> getCurrentAddress() async {
    // List<Placemark> placemarks = await placemarkFromCoordinates(latitude, longitude);
    // return placemarks.first.name ?? "";
    return "";
  }
}

Future<Map<Permission, PermissionStatus>> requestPermissions() async {
  var permissionResults = [Permission.location].request();
  return permissionResults;
}
