import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
import 'package:huixiang/utils/flutter_utils.dart';
import 'package:huixiang/utils/location.dart';
import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

class LocationMap extends StatefulWidget {
  final Map<String, String> arguments;

  LocationMap({this.arguments});

  @override
  State<StatefulWidget> createState() {
    return _LocationMap();
  }
}

class _LocationMap extends State<LocationMap> {
  @override
  void initState() {
    super.initState();

    startLocation();
  }

  void startLocation() async {
    Location.getInstance()
        .aMapFlutterLocation
        .onResultCallback()
        .listen((event) {
      if (event != null &&
          event["latitude"] != null &&
          event["longitude"] != null) {
        print("location: $event");
        if (event["latitude"] is String && event["longitude"] is String) {
          myLatLng = BMFCoordinate(double.tryParse(event["latitude"]),
              double.tryParse(event["longitude"]));
        } else {
          myLatLng = BMFCoordinate(event["latitude"], event["longitude"]);
        }
        AppUtils.coordConvert(myLatLng).then((value) {
          this.myLatLng = value;
          locationShow();
        });
      }
    });
    Location.getInstance().prepareLoc();
    Location.getInstance().startLocation(context);
  }

  locationShow() {
    BMFLocation location = BMFLocation(
      coordinate: myLatLng,
      altitude: 0,
      horizontalAccuracy: 5,
      verticalAccuracy: -1.0,
      speed: -1.0,
      course: -1.0,
    );
    BMFUserLocation userLocation = BMFUserLocation(
      location: location,
    );
    setState(() {
      _mapController.updateLocationData(userLocation);
    });
  }

  @override
  void dispose() {
    super.dispose();
    Location.getInstance().stopLocation();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: MyAppBar(
        background: Color(0xFFF7F7F7),
        title: widget.arguments["storeName"],
        titleColor: Colors.black87,
        titleSize: 18.sp,
        leadingColor: Colors.black,
      ),
      body: Container(
        child: BMFMapWidget(
          mapOptions: BMFMapOptions(
            center: BMFCoordinate(
              double.tryParse(widget.arguments["lat"]),
              double.tryParse(widget.arguments["lng"]),
            ),
            showZoomControl: false,
            showMapScaleBar: false,
            zoomLevel: 12,
          ),
          onBMFMapCreated: onMapCreated,
        ),
      ),
    );
  }

  BMFMapController _mapController;
  BMFCoordinate latLng;
  BMFCoordinate myLatLng;
  BMFMarker bmfMarker;

  onMapCreated(BMFMapController controller) {
    _mapController = controller;
    setState(() {
      _mapController.showUserLocation(true);
      _mapController.setCustomMapStyle('assets/map_style/chatian.sty', 0);
      BMFUserLocationDisplayParam displayParam = BMFUserLocationDisplayParam(
        locationViewOffsetX: 0,
        locationViewOffsetY: 0,
        accuracyCircleFillColor: Colors.red,
        accuracyCircleStrokeColor: Colors.blue,
        isAccuracyCircleShow: true,
        locationViewImage: 'assets/image/icon_my_location.webp',
        locationViewHierarchy:
            BMFLocationViewHierarchy.LOCATION_VIEW_HIERARCHY_BOTTOM,
      );
      _mapController.updateLocationViewWithParam(displayParam);
      addMarker();
    });
  }

  addMarker() async {
    // latLng = await AppUtils.coordConvert(BMFCoordinate(double.tryParse(widget.arguments["lat"]),
    //     double.tryParse(widget.arguments["lng"])));
    latLng = BMFCoordinate(double.tryParse(widget.arguments["lat"]),
        double.tryParse(widget.arguments["lng"]));

    if (bmfMarker == null && _mapController != null) {
      bmfMarker = BMFMarker(
        position: latLng,
        centerOffset: BMFPoint(0.5, 0.7),
        enabled: false,
        icon: "assets/image/icon_map_marker.webp",
        draggable: false,
      );
      _mapController.addMarker(bmfMarker);
    }
    _mapController.updateMapOptions(
      BMFMapOptions(
        center: latLng,
        zoomLevel: 15,
      ),
    );
  }
}