// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

part of google_maps_flutter_web;

/// The `MarkerController` class wraps a [gmaps.Marker], how it handles events, and its associated (optional) [gmaps.InfoWindow] widget.
class MarkerController {
  /// Creates a `MarkerController`, which wraps a [gmaps.Marker] object, its `onTap`/`onDrag` behavior, and its associated [gmaps.InfoWindow].
  MarkerController({
    required gmaps.Marker marker,
    gmaps.InfoWindow? infoWindow,
    bool consumeTapEvents = false,
    LatLngCallback? onDragStart,
    LatLngCallback? onDrag,
    LatLngCallback? onDragEnd,
    ui.VoidCallback? onTap,
  })  : _marker = marker,
        _infoWindow = infoWindow,
        _consumeTapEvents = consumeTapEvents {
    if (onTap != null) {
      marker.onClick.listen((gmaps.MapMouseEvent event) {
        onTap.call();
      });
    }
    if (onDragStart != null) {
      marker.onDragstart.listen((gmaps.MapMouseEvent event) {
        if (marker != null) {
          marker.position = event.latLng;
        }
        onDragStart.call(event.latLng ?? _nullGmapsLatLng);
      });
    }
    if (onDrag != null) {
      marker.onDrag.listen((gmaps.MapMouseEvent event) {
        if (marker != null) {
          marker.position = event.latLng;
        }
        onDrag.call(event.latLng ?? _nullGmapsLatLng);
      });
    }
    if (onDragEnd != null) {
      marker.onDragend.listen((gmaps.MapMouseEvent event) {
        if (marker != null) {
          marker.position = event.latLng;
        }
        onDragEnd.call(event.latLng ?? _nullGmapsLatLng);
      });
    }
  }

  gmaps.Marker? _marker;

  final bool _consumeTapEvents;

  final gmaps.InfoWindow? _infoWindow;

  bool _infoWindowShown = false;

  /// Returns `true` if this Controller will use its own `onTap` handler to consume events.
  bool get consumeTapEvents => _consumeTapEvents;

  /// Returns `true` if the [gmaps.InfoWindow] associated to this marker is being shown.
  bool get infoWindowShown => _infoWindowShown;

  /// Returns the [gmaps.Marker] associated to this controller.
  gmaps.Marker? get marker => _marker;

  /// Returns the [gmaps.InfoWindow] associated to the marker.
  @visibleForTesting
  gmaps.InfoWindow? get infoWindow => _infoWindow;

  /// Updates the options of the wrapped [gmaps.Marker] object.
  ///
  /// This cannot be called after [remove].
  void update(
    gmaps.MarkerOptions options, {
    HtmlElement? newInfoWindowContent,
  }) {
    assert(_marker != null, 'Cannot `update` Marker after calling `remove`.');
    _marker!.options = options;
    if (_infoWindow != null && newInfoWindowContent != null) {
      _infoWindow!.content = newInfoWindowContent;
    }
  }

  /// Disposes of the currently wrapped [gmaps.Marker].
  void remove() {
    if (_marker != null) {
      _infoWindowShown = false;
      _marker!.visible = false;
      _marker!.map = null;
      _marker = null;
    }
  }

  /// Hide the associated [gmaps.InfoWindow].
  ///
  /// This cannot be called after [remove].
  void hideInfoWindow() {
    assert(_marker != null, 'Cannot `hideInfoWindow` on a `remove`d Marker.');
    if (_infoWindow != null) {
      _infoWindow!.close();
      _infoWindowShown = false;
    }
  }

  /// Show the associated [gmaps.InfoWindow].
  ///
  /// This cannot be called after [remove].
  void showInfoWindow() {
    assert(_marker != null, 'Cannot `showInfoWindow` on a `remove`d Marker.');
    if (_infoWindow != null) {
      _infoWindow!.open(_marker!.map, _marker);
      _infoWindowShown = true;
    }
  }
}
