"""Comprobacion de punto dentro de poligono con soporte de agujeros (holes)."""

from python.functions.geo.point_in_ring import point_in_ring


def point_in_polygon(lon: float, lat: float, polygon: list[list[tuple[float, float]]]) -> bool:
    """Determina si el punto (lon, lat) esta dentro del poligono.

    polygon[0] es el anillo exterior. polygon[1:] son agujeros (holes).
    Retorna True si el punto esta en el exterior y NO en ningun agujero.

    Args:
        lon: longitud del punto en grados.
        lat: latitud del punto en grados.
        polygon: lista de anillos; el primero es el exterior, el resto son agujeros.

    Returns:
        True si el punto esta dentro del poligono (y fuera de todos los holes).
    """
    if not polygon:
        return False
    outer = polygon[0]
    if not point_in_ring(lon, lat, outer):
        return False
    for hole in polygon[1:]:
        if point_in_ring(lon, lat, hole):
            return False
    return True
