"""Ray casting para determinar si un punto esta dentro de un anillo (ring) poligonal."""


def point_in_ring(lon: float, lat: float, ring: list[tuple[float, float]]) -> bool:
    """Determina si el punto (lon, lat) esta dentro del anillo cerrado ring.

    Usa el algoritmo de ray casting. Retorna False si len(ring) < 3.

    Args:
        lon: longitud del punto en grados.
        lat: latitud del punto en grados.
        ring: lista de vertices (lon, lat) que forman el anillo.

    Returns:
        True si el punto esta dentro del anillo, False en caso contrario.
    """
    inside = False
    n = len(ring)
    if n < 3:
        return False
    j = n - 1
    for i in range(n):
        xi, yi = ring[i]
        xj, yj = ring[j]
        intersects = ((yi > lat) != (yj > lat)) and (
            lon < (xj - xi) * (lat - yi) / (yj - yi + 1e-15) + xi
        )
        if intersects:
            inside = not inside
        j = i
    return inside
