"""Comprobacion de punto contra una lista de poligonos con prefiltraje por bbox."""

from python.functions.geo.point_in_polygon import point_in_polygon


def point_in_polygons_bbox(
    lon: float,
    lat: float,
    polygons: list[list[list[tuple[float, float]]]],
    bboxes: list[tuple[float, float, float, float]],
) -> bool:
    """Determina si el punto (lon, lat) esta dentro de CUALQUIER poligono de la lista.

    Aplica un prefiltraje por bounding box antes de ejecutar el ray casting completo,
    lo que mejora el rendimiento cuando hay muchos poligonos.

    Args:
        lon: longitud del punto en grados.
        lat: latitud del punto en grados.
        polygons: lista de poligonos, cada uno como lista de anillos (exterior + holes).
        bboxes: lista de bboxes precalculados (minx, miny, maxx, maxy) para cada poligono.

    Returns:
        True si el punto esta dentro de al menos uno de los poligonos.
    """
    for polygon, (minx, miny, maxx, maxy) in zip(polygons, bboxes):
        if lon < minx or lon > maxx or lat < miny or lat > maxy:
            continue
        if point_in_polygon(lon, lat, polygon):
            return True
    return False
