import 'package:flutter_polyline_points/flutter_polyline_points.dart';
import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:http/http.dart';
import 'package:shared_preferences/shared_preferences.dart';

import '../../Helper/Constants/Colorconstants.dart';

class DirectionMapController extends GetxController{

  String? googleApiKey;


  late GoogleMapController mapController;
  // double _originLatitude = 6.5212402, _originLongitude = 3.3679965;
  // double _destLatitude = 6.849660, _destLongitude = 3.648190;
  double? originLatitude;
  double? originLongitude;
  double? destLatitude;
  double? destLongitude;

  static LatLng? center;


  Map<MarkerId, Marker> markers = {};
  Map<PolylineId, Polyline> polylines = {};
  List<LatLng> polylineCoordinates = [];
  PolylinePoints polylinePoints = PolylinePoints();




  void onMapCreated(GoogleMapController controller) async {
    mapController = controller;
  }

  addMarker(LatLng position, String id, BitmapDescriptor descriptor) {
    print('originLatitudeaddMarkercontroller $originLatitude');
    print('originLongitudeaddMarkercontroller $originLongitude');
    print('destLatitudeaddMarkercontroller $destLatitude');
    print('destLongitudeaddMarkercontroller $destLongitude');

    MarkerId markerId = MarkerId(id);
    Marker marker =
    Marker(markerId: markerId, icon: descriptor, position: position);
    markers[markerId] = marker;
  }

  addPolyLine() {
    PolylineId id = PolylineId("poly");
    Polyline polyline = Polyline(
        polylineId: id,
        color: ColorConstants.primaryColor,
        points: polylineCoordinates,
        jointType: JointType.mitered,
        geodesic: true,
        visible: true,
        width: 10




    );
    polylines[id] = polyline;
  update();
  }


  void setCameraPosition(List<LatLng> coordinates) {
    LatLngBounds bounds = boundsFromLatLngList(coordinates);
    CameraUpdate cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 50); // Adjust padding as needed
    mapController.animateCamera(cameraUpdate);
  }


  LatLngBounds boundsFromLatLngList(List<LatLng> list) {
    double? x0, x1, y0, y1;

    for (LatLng latLng in list) {
      if (x0 == null || latLng.latitude < x0) x0 = latLng.latitude;
      if (x1 == null || latLng.latitude > x1) x1 = latLng.latitude;
      if (y0 == null || latLng.longitude < y0) y0 = latLng.longitude;
      if (y1 == null || latLng.longitude > y1) y1 = latLng.longitude;
    }

    return LatLngBounds(northeast: LatLng(x1!, y1!), southwest: LatLng(x0!, y0!));
  }



  getPolyline() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    print('originLatitudegetPolylinecontroller $originLatitude');
    print('originLongitudegetPolylinecontroller $originLongitude');
    print('destLatitudegetPolylinecontroller $destLatitude');
    print('destLongitudegetPolylinecontroller $destLongitude');
    googleApiKey = prefs.getString('googleApiKey')??'AIzaSyBhkGfnq27sN0wV5y_S-M2KojpFTk_by-Q';
    PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
      request: PolylineRequest(
        origin: PointLatLng(originLatitude ?? 0.0, originLongitude ?? 0.0),
        destination: PointLatLng(destLatitude ?? 0.0, destLongitude ?? 0.0),
        mode: TravelMode.driving,
        // Optional:
        // wayPoints: [PolylineWayPoint(location: "Some location string")]
      ),
      googleApiKey: googleApiKey ?? 'YOUR_API_KEY',
    );


    if (result.points.isNotEmpty) {
      // dropChangeZoom(13);
      polylineCoordinates.clear();

      result.points.forEach((PointLatLng point) {
        polylineCoordinates.add(LatLng(point.latitude, point.longitude));

        setCameraPosition(polylineCoordinates);

      });
    }
    addPolyLine();
  }

  @override
  void onInit() {
    // TODO: implement onInit



    super.onInit();
  }
}