import math
from typing import Tuple


# class GeoMember:
#     def __init__(self, name: bytes, lat: float, long: float):
#         self.name = name
#         self.long = long
#         self.lat = lat
#
#     @staticmethod
#     def from_bytes_tuple(t: Tuple[bytes, bytes, bytes]) -> 'GeoMember':
#         long = Float.decode(t[0])
#         lat = Float.decode(t[1])
#         name = t[2]
#         return GeoMember(name, lat, long)
#
#     def geohash(self):
#         return geohash.encode(self.lat, self.long)


def distance(origin: Tuple[float, float], destination: Tuple[float, float]) -> float:
    """Calculate the Haversine distance in meters."""
    radius = 6372797.560856  # Earth's quatratic mean radius for WGS-84

    lat1, lon1, lat2, lon2 = map(
        math.radians, [origin[0], origin[1], destination[0], destination[1]]
    )

    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = (
        math.sin(dlat / 2) ** 2
        + math.cos(lat1) * math.cos(lat2) * math.sin(dlon / 2) ** 2
    )
    c = 2 * math.asin(math.sqrt(a))

    return c * radius
