import 'dart:collection';

import 'package:fast_network_navigation/structs/landmark.dart';
import 'package:fast_network_navigation/structs/trip.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

class MapWidget extends StatefulWidget {

  final Future<Trip>? trip;

  MapWidget({
    this.trip
  });

  @override
  State<MapWidget> createState() => _MapWidgetState();
}

class _MapWidgetState extends State<MapWidget> {
  late GoogleMapController mapController;
  // coordinates of Paris
  CameraPosition _cameraPosition = CameraPosition(
    target: LatLng(48.8566, 2.3522),
    zoom: 11.0,
  );
  Set<Marker> markers = <Marker>{};
  

  void _onMapCreated(GoogleMapController controller) async {
    mapController = controller;
    Trip? trip = await widget.trip;
    List<double>? newLocation = trip?.landmarks.first.location;
    if (newLocation != null) {
      CameraUpdate update = CameraUpdate.newLatLng(LatLng(newLocation[0], newLocation[1]));
      controller.moveCamera(update);
    }
    drawLandmarks();
  }


  void _onCameraIdle() {
    // print(mapController.getLatLng(ScreenCoordinate(x: 0, y: 0)));
  }


  void drawLandmarks() async {
    // (re)draws landmarks on the map
    Trip? trip = await widget.trip;
    LinkedList<Landmark>? landmarks = trip?.landmarks;
    if (landmarks != null){
      setState(() {
        for (Landmark landmark in landmarks) {
          markers.add(Marker(
            markerId: MarkerId(landmark.name),
            position: LatLng(landmark.location[0], landmark.location[1]),
            infoWindow: InfoWindow(title: landmark.name, snippet: landmark.type.name),
          ));
        }
      });
    }
  }


  @override
  Widget build(BuildContext context) {
    return GoogleMap(
      onMapCreated: _onMapCreated,
      initialCameraPosition: _cameraPosition,
      onCameraIdle: _onCameraIdle,
      // onLongPress: ,
      markers: markers,
      cloudMapId: '41c21ac9b81dbfd8',
    );
  }
}