// The MIT License (MIT)
//
// Copyright (c) 2008 Krasimir Tsonev
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

import 'package:google_maps/google_maps.dart' as gmaps;

/// Returns a screen location that corresponds to a geographical coordinate ([gmaps.LatLng]).
///
/// The screen location is in pixels relative to the top left of the Map widget
/// (not of the whole screen/app).
///
/// See: https://developers.google.com/maps/documentation/android-sdk/reference/com/google/android/libraries/maps/Projection#public-point-toscreenlocation-latlng-location
gmaps.Point toScreenLocation(gmaps.GMap map, gmaps.LatLng coords) {
  final num? zoom = map.zoom;
  final gmaps.LatLngBounds? bounds = map.bounds;
  final gmaps.Projection? projection = map.projection;

  assert(
      bounds != null, 'Map Bounds required to compute screen x/y of LatLng.');
  assert(projection != null,
      'Map Projection required to compute screen x/y of LatLng.');
  assert(zoom != null,
      'Current map zoom level required to compute screen x/y of LatLng.');

  final gmaps.LatLng ne = bounds!.northEast;
  final gmaps.LatLng sw = bounds.southWest;

  final gmaps.Point topRight = projection!.fromLatLngToPoint!(ne)!;
  final gmaps.Point bottomLeft = projection.fromLatLngToPoint!(sw)!;

  final int scale = 1 << (zoom!.toInt()); // 2 ^ zoom

  final gmaps.Point worldPoint = projection.fromLatLngToPoint!(coords)!;

  return gmaps.Point(
    ((worldPoint.x! - bottomLeft.x!) * scale).toInt(),
    ((worldPoint.y! - topRight.y!) * scale).toInt(),
  );
}
