using System.Text.Json.Serialization;

namespace ZTest0049Pwrs.Web.Models
{
    public class WeatherApiResponse
    {
        [JsonPropertyName("current")]
        public CurrentWeather Current { get; set; } = null!;

        [JsonPropertyName("forecast")]
        public Forecast Forecast { get; set; } = null!;

        [JsonPropertyName("location")]
        public Location Location { get; set; } = null!;
    }

    public class Location
    {
        [JsonPropertyName("lat")]
        public double Lat { get; set; }

        [JsonPropertyName("lon")]
        public double Lon { get; set; }
    }

    public class CurrentWeather
    {
        [JsonPropertyName("temp_c")]
        public double TemperatureC { get; set; }

        [JsonPropertyName("condition")]
        public Condition Condition { get; set; } = null!;

        [JsonPropertyName("humidity")]
        public int Humidity { get; set; }

        [JsonPropertyName("wind_kph")]
        public double WindKph { get; set; }

        [JsonPropertyName("pressure_mb")]
        public double PressureMb { get; set; }

        public double PressureMmHg
        {
            get
            {
                const double mbToMmHg = 0.750062;
                return (int)Math.Round(PressureMb * mbToMmHg);
            }
        }

        [JsonPropertyName("feelslike_c")]
        public double FeelsLikeC { get; set; }

        [JsonPropertyName("uv")]
        public double Uv { get; set; }
    }

    public class Condition
    {
        [JsonPropertyName("text")]
        public string Text { get; set; } = null!;

        [JsonPropertyName("icon")]
        public string Icon { get; set; } = null!;

        // Локализованный текст на русском
        public string LocalizedText => LocalizeWeatherCondition(Text);

        private static string LocalizeWeatherCondition(string englishCondition)
        {
            if (string.IsNullOrEmpty(englishCondition))
                return englishCondition;

            var translations = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
            {
                // Основные погодные условия
                { "Sunny", "Солнечно" },
                { "Clear", "Ясно" },
                { "Partly cloudy", "Переменная облачность" },
                { "Cloudy", "Облачно" },
                { "Overcast", "Пасмурно" },
                { "Mist", "Туман" },
                { "Fog", "Туман" },
                { "Freezing fog", "Ледяной туман" },
                
                // Дождь
                { "Patchy rain possible", "Возможен небольшой дождь" },
                { "Patchy light rain", "Небольшой дождь" },
                { "Light rain", "Небольшой дождь" },
                { "Moderate rain at times", "Временами умеренный дождь" },
                { "Moderate rain", "Умеренный дождь" },
                { "Heavy rain at times", "Временами сильный дождь" },
                { "Heavy rain", "Сильный дождь" },
                { "Light freezing rain", "Небольшой ледяной дождь" },
                { "Moderate or heavy freezing rain", "Умеренный или сильный ледяной дождь" },
                { "Light rain shower", "Небольшой ливневый дождь" },
                { "Moderate or heavy rain shower", "Умеренный или сильный ливневый дождь" },
                { "Torrential rain shower", "Проливной дождь" },
                
                // Снег
                { "Patchy snow possible", "Возможен небольшой снег" },
                { "Patchy light snow", "Небольшой снег" },
                { "Light snow", "Небольшой снег" },
                { "Patchy moderate snow", "Умеренный снег" },
                { "Moderate snow", "Умеренный снег" },
                { "Patchy heavy snow", "Сильный снег" },
                { "Heavy snow", "Сильный снег" },
                { "Light snow showers", "Небольшие снегопады" },
                { "Moderate or heavy snow showers", "Умеренные или сильные снегопады" },
                { "Light sleet", "Небольшая мокрый снег" },
                { "Moderate or heavy sleet", "Умеренный или сильный мокрый снег" },
                { "Light sleet showers", "Небольшие осадки (мокрый снег)" },
                { "Moderate or heavy sleet showers", "Умеренные или сильные осадки (мокрый снег)" },
                { "Ice pellets", "Ледяная крупа" },
                { "Light showers of ice pellets", "Небольшая ледяная крупа" },
                { "Moderate or heavy showers of ice pellets", "Умеренная или сильная ледяная крупа" },
                
                // Гроза
                { "Thunderstorm", "Гроза" },
                { "Thunderstorm in nearby", "Гроза поблизости" },
                { "Patchy light rain with thunder", "Небольшой дождь с грозой" },
                { "Moderate or heavy rain with thunder", "Умеренный или сильный дождь с грозой" },
                { "Patchy light snow with thunder", "Небольшой снег с грозой" },
                { "Moderate or heavy snow with thunder", "Умеренный или сильный снег с грозой" },
                
                // Другие условия
                { "Blizzard", "Метель" },
                { "Blowing snow", "Поземок" },
                { "Hail", "Град" },
                { "Patchy freezing drizzle possible", "Возможна ледяная морось" },
                { "Freezing drizzle", "Ледяная морось" },
                { "Drizzle", "Морось" },
                { "Patchy light drizzle", "Небольшая морось" }
            };

            return translations.TryGetValue(englishCondition, out string? localized) ? localized : englishCondition;
        }
    }

    public class Forecast
    {
        [JsonPropertyName("forecastday")]
        public List<ForecastDay> ForecastDays { get; set; } = null!;
    }

    public class ForecastDay
    {
        [JsonPropertyName("date")]
        public string Date { get; set; } = null!;

        [JsonPropertyName("day")]
        public DayWeather Day { get; set; } = null!;

        [JsonPropertyName("hour")]
        public List<HourWeather> Hours { get; set; } = null!;
    }

    public class DayWeather
    {
        [JsonPropertyName("maxtemp_c")]
        public double MaxTempC { get; set; }

        [JsonPropertyName("mintemp_c")]
        public double MinTempC { get; set; }

        [JsonPropertyName("avgtemp_c")]
        public double AvgTempC { get; set; }

        [JsonPropertyName("condition")]
        public Condition Condition { get; set; } = null!;

        [JsonPropertyName("daily_chance_of_rain")]
        public int ChanceOfRain { get; set; }
    }

    public class HourWeather
    {
        [JsonPropertyName("time")]
        public string Time { get; set; } = null!;

        [JsonPropertyName("temp_c")]
        public double TemperatureC { get; set; }

        [JsonPropertyName("condition")]
        public Condition Condition { get; set; } = null!;

        [JsonPropertyName("chance_of_rain")]
        public int ChanceOfRain { get; set; }

        [JsonPropertyName("wind_kph")]
        public double WindKph { get; set; }
    }
}
