import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:geolocator/geolocator.dart';
import 'package:get/get.dart';
import 'package:rasadyar_core/presentation/common/app_color.dart';
import 'package:rasadyar_core/presentation/common/app_fonts.dart';
import 'package:rasadyar_core/presentation/common/assets.gen.dart';
import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart';
import 'package:rasadyar_core/presentation/widget/buttons/fab.dart';
import 'package:rasadyar_core/presentation/widget/buttons/outline_elevated.dart';

import 'logic.dart';

class MapWidget extends GetView<MapWidgetLogic> {
  final VoidCallback? initOnTap;
  final Widget? initMarkerWidget;
  final Widget markerWidget;

  const MapWidget({
    this.initOnTap,
    this.initMarkerWidget,
    required this.markerWidget,
    super.key,
  });

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        ObxValue((errorType) {
          if (errorType.isNotEmpty) {
            if (errorType.contains(ErrorLocationType.serviceDisabled)) {
              Future.microtask(() {
                Get.defaultDialog(
                  title: 'خطا',
                  content: const Text('سرویس مکان‌یابی غیرفعال است'),
                  cancel: ROutlinedElevated(
                    text: 'بررسی مجدد',
                    width: 120,
                    textStyle: AppFonts.yekan16,
                    onPressed: () async {
                      var service = await controller.locationServiceEnabled();
                      if (service) {
                        controller.errorLocationType.remove(
                          ErrorLocationType.serviceDisabled,
                        );
                        Get.back();
                      }
                      // Don't call Get.back() if service is still disabled
                    },
                  ),
                  confirm: RElevated(
                    text: 'روشن کردن',
                    textStyle: AppFonts.yekan16,
                    width: 120,
                    onPressed: () async {
                      var res = await Geolocator.openLocationSettings();
                      if (res) {
                        var service = await controller.locationServiceEnabled();
                        if (service) {
                          controller.errorLocationType.remove(
                            ErrorLocationType.serviceDisabled,
                          );
                          Get.back();
                        }
                      }
                    },
                  ),
                  contentPadding: EdgeInsets.all(8),
                  onWillPop: () async {
                    return controller.errorLocationType.isEmpty;
                  },
                  barrierDismissible: false,
                );
              });
            } else {
              Future.microtask(() {
                Get.defaultDialog(
                  title: 'خطا',
                  content: const Text(' دسترسی به سرویس مکان‌یابی غیرفعال است'),
                  cancel: ROutlinedElevated(
                    text: 'بررسی مجدد',
                    width: 120,
                    textStyle: AppFonts.yekan16,
                    onPressed: () async {
                      await controller.checkPermission();
                    },
                  ),
                  confirm: RElevated(
                    text: 'اجازه دادن',
                    textStyle: AppFonts.yekan16,
                    width: 120,
                    onPressed: () async {
                      var res = await controller.checkPermission(request: true);
                      if (res) {
                        controller.errorLocationType.remove(
                          ErrorLocationType.permissionDenied,
                        );
                        Get.back();
                      }
                    },
                  ),

                  contentPadding: EdgeInsets.all(8),
                  onWillPop: () async {
                    return controller.errorLocationType.isEmpty;
                  },
                  barrierDismissible: false,
                );
              });
            }
          }
          return const SizedBox.shrink();
        }, controller.errorLocationType),
        _buildMap(),
        _buildGpsButton(),
        _buildFilterButton(),
      ],
    );
  }

  Widget _buildMap() {
    return ObxValue((currentLocation) {
      return FlutterMap(
        mapController: controller.animatedMapController.mapController,
        options: MapOptions(
          initialCenter: currentLocation.value,
          initialZoom: 18,
          onPositionChanged: (camera, hasGesture) {
            if (hasGesture) {
              controller.debouncedUpdateVisibleMarkers(center: camera.center);
            }
            //controller.debouncedUpdateVisibleMarkers(center: camera.center);
          },
        ),
        children: [
          TileLayer(urlTemplate: controller.tileType),
          ObxValue((markers) {
            return MarkerLayer(
              markers:
                  markers
                      .map(
                        (e) => Marker(
                          point: e.point,
                          child: GestureDetector(
                            onTap: e.id != -1 ? e.onTap : initOnTap,
                            child:
                                e.id != -1
                                    ? markerWidget
                                    : initMarkerWidget ?? SizedBox.shrink(),
                          ),
                        ),
                      )
                      .toList(),
            );
          }, controller.markers),
        ],
      );
    }, controller.currentLocation);
  }

  Widget _buildGpsButton() {
    return Positioned(
      right: 10,
      bottom: 83,
      child: ObxValue((data) {
        return RFab.small(
          backgroundColor: AppColor.greenNormal,
          isLoading: data.value,
          icon: Assets.vec.gpsSvg.svg(),
          onPressed: () async {
            controller.isLoading.value = true;
            await controller.determineCurrentPosition();
            controller.isLoading.value = false;
          },
        );
      }, controller.isLoading),
    );
  }

  Widget _buildFilterButton() {
    return Positioned(
      right: 10,
      bottom: 30,
      child: RFab.small(
        backgroundColor: AppColor.blueNormal,
        icon: Assets.vec.filterSvg.svg(width: 24, height: 24),
        onPressed: () {},
      ),
    );
  }

  /*Marker markerWidget({required LatLng marker, required VoidCallback onTap}) {
    return Marker(
      point: marker,
      child: GestureDetector(
        onTap: onTap,
        behavior: HitTestBehavior.opaque,
        child: SizedBox(
          width: 36,
          height: 36,
          child: Assets.vec.mapMarkerSvg.svg(width: 30, height: 30),
        ),
      ),
    );
  }*/
}
