using System.Text.Json.Serialization;

namespace SatelliteProvider.Common.DTO;

public class GeoPoint
{
    const double PRECISION_TOLERANCE = 0.00005;

    [JsonRequired]
    [JsonPropertyName("lat")]
    public double Lat { get; set; }

    [JsonRequired]
    [JsonPropertyName("lon")]
    public double Lon { get; set; }

    public GeoPoint() { }

    public GeoPoint(double lat, double lon)
    {
        Lat = lat;
        Lon = lon;
    }

    public override string ToString() => $"{Lat:F4}, {Lon:F4}";

    public override bool Equals(object? obj)
    {
        if (obj is not GeoPoint point) return false;
        return ReferenceEquals(this, obj) || Equals(point);
    }

    private bool Equals(GeoPoint point) =>
        Math.Abs(Lat - point.Lat) < PRECISION_TOLERANCE && Math.Abs(Lon - point.Lon) < PRECISION_TOLERANCE;

    public override int GetHashCode() => HashCode.Combine(Lat, Lon);

    public static bool operator ==(GeoPoint left, GeoPoint right) => Equals(left, right);
    public static bool operator !=(GeoPoint left, GeoPoint right) => !Equals(left, right);
}
