""" Collector for Bright Sky (Weather) API. """ import logging from datetime import datetime, timedelta, timezone import polars as pl from utils import request_utils from utils.config_loader import settings logger = logging.getLogger(__name__) def fetch_weather(lat: float = None, lon: float = None) -> pl.DataFrame: """ Fetches historical weather data from Bright Sky API. Filters for the specific columns defined in the Bronze schema. Returns: A Polars DataFrame containing filtered raw weather parameters. """ lat = lat or settings.brightsky.lat lon = lon or settings.brightsky.lon url = settings.brightsky.base_url current_utc = datetime.now(timezone.utc) payload = { "date": (current_utc - timedelta(hours=72)).isoformat(), "last_date": current_utc.isoformat(), "lat": lat, "lon": lon, "units": "dwd", "tz": "Etc/UTC", } schema_cols = [ "timestamp", "temperature", "wind_speed", "solar", "sunshine", "cloud_cover", "precipitation", ] try: data = request_utils.make_requests(url, params=payload) weather_list = data.get("weather", []) if not weather_list: logger.warning("No weather data returned from API.") return pl.DataFrame() df = pl.DataFrame(weather_list) available_cols = [c for c in schema_cols if c in df.columns] return df.select(available_cols) except Exception as e: logger.error(f"Failed to fetch weather data: {e}") return pl.DataFrame()