import 'dart:async';

import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
import 'package:ride/constant/box_name.dart';
import 'package:ride/constant/links.dart';
import 'package:ride/controller/functions/crud.dart';
import 'package:ride/main.dart';

// LocationController.dart
class LocationController extends GetxController {
  LocationData? _currentLocation;
  late Location location;
  bool isLoading = false;
  LatLng myLocation = const LatLng(32.3, 36.3);

  LocationData? get currentLocation => _currentLocation;
  Timer? _locationTimer;

  @override
  void onInit() async {
    super.onInit();
    location = Location();
  }

  void startLocationUpdates() async {
    _locationTimer = Timer.periodic(const Duration(seconds: 20), (timer) async {
      try {
        await getLocation();

        await CRUD().post(link: AppLink.addCarsLocationByPassenger, payload: {
          'driver_id': box.read(BoxName.driverID).toString(),
          'latitude': myLocation.latitude.toString(),
          'longitude': myLocation.longitude.toString(),
          'status': box.read(BoxName.statusDriverLocation).toString()
        });
      } catch (e) {
        // Handle the error gracefully
        print('Error during location updates: $e');
      }
    });
  }

  void stopLocationUpdates() {
    _locationTimer?.cancel();
  }

  Future<void> getLocation() async {
    isLoading = true;
    update();
    bool serviceEnabled;
    PermissionStatus permissionGranted;

    // Check if location services are enabled
    serviceEnabled = await location.serviceEnabled();
    if (!serviceEnabled) {
      serviceEnabled = await location.requestService();
      if (!serviceEnabled) {
        // Location services are still not enabled, handle the error
        return;
      }
    }

    // Check if the app has permission to access location
    permissionGranted = await location.hasPermission();
    if (permissionGranted == PermissionStatus.denied) {
      permissionGranted = await location.requestPermission();
      if (permissionGranted != PermissionStatus.granted) {
        // Location permission is still not granted, handle the error
        return;
      }
    }

    // Configure location accuracy
    // LocationAccuracy desiredAccuracy = LocationAccuracy.high;

    // Get the current location
    LocationData _locationData = await location.getLocation();
    myLocation =
        (_locationData.latitude != null && _locationData.longitude != null
            ? LatLng(_locationData.latitude!, _locationData.longitude!)
            : null)!;

    // Print location details
    print('Accuracy: ${_locationData.accuracy}');
    print('Latitude: ${_locationData.latitude}');
    print('Longitude: ${_locationData.longitude}');
    print('Time: ${_locationData.time}');
    isLoading = false;
    update();
  }
}
