import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intaleq_maps/intaleq_maps.dart';
import 'package:siro_driver/constant/api_key.dart';
import 'package:siro_driver/constant/box_name.dart';
import 'package:siro_driver/constant/links.dart';
import 'package:siro_driver/controller/functions/crud.dart';
import 'package:siro_driver/controller/functions/tts.dart';

import '../../../main.dart';

/// Handles map-related logic: fetching routes, drawing polylines, and managing markers.
class NavigationService extends GetxService {
  final CRUD _crud = CRUD();
  final TextToSpeechController _tts = Get.put(TextToSpeechController());

  final RxSet<Marker> markers = <Marker>{}.obs;
  final RxSet<Polyline> polylines = <Polyline>{}.obs;
  final RxString currentInstruction = "".obs;

  InlqBitmap carIcon = InlqBitmap.defaultMarker;
  InlqBitmap passengerIcon = InlqBitmap.defaultMarker;
  InlqBitmap startIcon = InlqBitmap.defaultMarker;
  InlqBitmap endIcon = InlqBitmap.defaultMarker;

  @override
  void onInit() {
    super.onInit();
    _loadCustomIcons();
  }

  void _loadCustomIcons() {
    carIcon = InlqBitmap.fromAsset('assets/images/car.png');
    passengerIcon = InlqBitmap.fromAsset('assets/images/picker.png');
    startIcon = InlqBitmap.fromAsset('assets/images/A.png');
    endIcon = InlqBitmap.fromAsset('assets/images/b.png');
  }

  Future<Map<String, dynamic>?> getRoute({
    required LatLng origin,
    required LatLng destination,
  }) async {
    final url =
        '${AppLink.googleMapsLink}directions/json?language=${box.read(BoxName.lang)}&destination=${destination.latitude},${destination.longitude}&origin=${origin.latitude},${origin.longitude}&key=${AK.mapAPIKEY}';

    final response = await _crud.getGoogleApi(link: url, payload: {});

    if (response != null && response['routes'].isNotEmpty) {
      return response['routes'][0];
    }
    return null;
  }

  void drawRoute(Map<String, dynamic> routeData, {Color color = Colors.blue}) {
    final pointsString = routeData["overview_polyline"]["points"];
    final points = PolylineUtils.decode(pointsString);

    final polyline = Polyline(
      polylineId: PolylineId(routeData["summary"] ?? DateTime.now().toString()),
      points: points,
      width: 8,
      color: color,
    );

    polylines.add(polyline);
  }

  void updateCarMarker(LatLng position, double heading) {
    markers.removeWhere((m) => m.markerId.value == 'MyLocation');
    markers.add(
      Marker(
        markerId: MarkerId('MyLocation'.tr),
        position: position,
        icon: carIcon,
        rotation: heading,
        anchor: const Offset(0.5, 0.5),
        flat: true,
      ),
    );
  }

  void setInitialMarkers(
      LatLng passengerLocation, LatLng passengerDestination) {
    markers.clear();
    markers.add(Marker(
      markerId: const MarkerId('passengerLocation'),
      position: passengerLocation,
      icon: passengerIcon,
    ));
    markers.add(Marker(
      markerId: const MarkerId('passengerDestination'),
      position: passengerDestination,
      icon: endIcon,
    ));
  }

  void clearRoutes() {
    polylines.clear();
    currentInstruction.value = "";
  }
}
