import datetime

from gallery.sketch.weather.model import Cloudness, Precipitation, WeatherValue
from gallery.sketch.weather.util import build_weather_value

from .openweather import ForecastItem


class ForecastItemParser:
    CLOUDNESS_MAP: dict[str, Cloudness] = {
        "clear sky": Cloudness.CLEAR,
        "few clouds": Cloudness.PARTLY_CLOUDY,
        "scattered clouds": Cloudness.PARTLY_CLOUDY,
        "broken clouds": Cloudness.CLOUDY,
        "overcast clouds": Cloudness.MAINLY_CLOUDY,
        "light rain": Cloudness.CLOUDY,
    }

    PRECIPITATION_MAP: dict[str, Precipitation] = {
        "light rain": Precipitation.SMALL_RAIN,
        "rain": Precipitation.RAIN,
        "heavy rain": Precipitation.SHOWER,
    }

    def parse(self, item: ForecastItem) -> WeatherValue:
        item_date = datetime.datetime.fromtimestamp(item.dt, datetime.UTC)
        item_date = item_date.replace(tzinfo=datetime.timezone.utc).astimezone(tz=None).replace(tzinfo=None)
        value = build_weather_value(item_date)
        # TODO parse temperature interval flag
        value.temperature = [round(item.main.temp)]
        # value.temperature = [round(item.main.temp_max), round(item.main.temp_min)]
        value.pressure = [round(item.main.pressure / 133.3 * 100)]
        value.humidity = item.main.humidity
        value.wind_speed = round(item.wind.speed)
        value.wind_gust = round(item.wind.gust)
        value.wind_direction = item.wind.deg
        value.sky.cloudness = self.CLOUDNESS_MAP.get(item.weather[0].description, Cloudness.CLEAR)
        value.sky.precipitation = self.PRECIPITATION_MAP.get(item.weather[0].description, Precipitation.NO)
        if item.rain:
            value.precipitation = round(item.rain.interval_3h, 1)
        return value


FORECAST_ITEM_PARSER = ForecastItemParser()
