package com.sikey.wa04.common.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 天气现象枚举类，用于表示各种不同的天气现象及其相关的代码和描述信息。
 * 该枚举中的每个值对应一种特定的天气现象，包含了对应的业务代码（MyCode、Code）以及白天和夜晚的天气描述（Day、Night）。
 *
 * @author luoyangwei
 */
@Getter
@AllArgsConstructor
public enum WeatherPhenomenon {
    /**
     * 表示晴天天气现象。
     * MyCode属性值为 "101"，Code属性值为 "00"，白天描述为 "Sunny"，夜晚描述为 "Clear"。
     */
    CLEAR("晴", "101", "00", "Sunny", "Clear"),
    /**
     * 表示多云天气现象。
     * MyCode属性值为 "100"，Code属性值为 "01"，白天和夜晚描述均为 "Cloudy"。
     */
    CLOUDY("多云", "100", "01", "Cloudy", "Cloudy"),
    /**
     * 表示阴天天气现象。
     * MyCode属性值为 "102"，Code属性值为 "02"，白天和夜晚描述均为 "Overcast"。
     */
    OVERCAST("阴", "102", "02", "Overcast", "Overcast"),
    /**
     * 表示阵雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "03"，白天和夜晚描述均为 "Shower"。
     */
    SHOWER("阵雨", "103", "03", "Shower", "Shower"),
    /**
     * 表示雷阵雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "04"，白天和夜晚描述均为 "Thundershower"。
     */
    THUNDERSHOWER("雷阵雨", "103", "04", "Thundershower", "Thundershower"),
    /**
     * 表示雷阵雨伴有冰雹天气现象。
     * MyCode属性值为 "103"，Code属性值为 "05"，白天和夜晚描述均为 "Thundershower with hail"。
     */
    THUNDERSHOWER_WITH_HAIL("雷阵雨伴有冰雹", "103", "05", "Thundershower with hail", "Thundershower with hail"),
    /**
     * 表示雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "301"，白天和夜晚描述均为 "Rain"。
     */
    RAIN("雨", "103", "301", "Rain", "Rain"),
    /**
     * 表示小雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "07"，白天和夜晚描述均为 "Light rain"。
     */
    LIGHT_RAIN("小雨", "103", "07", "Light rain", "Light rain"),
    /**
     * 表示中雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "08"，白天和夜晚描述均为 "Moderate rain"。
     */
    MODERATE_RAIN("中雨", "103", "08", "Moderate rain", "Moderate rain"),
    /**
     * 表示大雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "09"，白天和夜晚描述均为 "Heavy rain"。
     */
    HEAVY_RAIN("大雨", "103", "09", "Heavy rain", "Heavy rain"),
    /**
     * 表示暴雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "10"，白天和夜晚描述均为 "Storm"。
     */
    STORM("暴雨", "103", "10", "Storm", "Storm"),
    /**
     * 表示大暴雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "11"，白天和夜晚描述均为 "Heavy storm"。
     */
    HEAVY_STORM("大暴雨", "103", "11", "Heavy storm", "Heavy storm"),
    /**
     * 表示特大暴雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "12"，白天和夜晚描述均为 "Severe storm"。
     */
    SEVERE_STORM("特大暴雨", "103", "12", "Severe storm", "Severe storm"),
    /**
     * 表示冻雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "19"，白天和夜晚描述均为 "Ice rain"。
     */
    ICE_RAIN("冻雨", "103", "19", "Ice rain", "Ice rain"),
    /**
     * 表示沙尘暴天气现象。
     * MyCode属性值为 "103"，Code属性值为 "20"，白天和夜晚描述均为 "Duststorm"。
     */
    DUSTSTORM("沙尘暴", "103", "20", "Duststorm", "Duststorm"),
    /**
     * 表示小到中雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "21"，白天和夜晚描述均为 "Light to moderate rain"。
     */
    LIGHT_TO_MODERATE_RAIN("小到中雨", "103", "21", "Light to moderate rain", "Light to moderate rain"),
    /**
     * 表示中到大雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "22"，白天和夜晚描述均为 "Moderate to heavy rain"。
     */
    MODERATE_TO_HEAVY_RAIN("中到大雨", "103", "22", "Moderate to heavy rain", "Moderate to heavy rain"),
    /**
     * 表示大到暴雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "23"，白天和夜晚描述均为 "Heavy rain to storm"。
     */
    HEAVY_RAIN_TO_STORM("大到暴雨", "103", "23", "Heavy rain to storm", "Heavy rain to storm"),
    /**
     * 表示暴雨到大暴雨天气现象。
     * MyCode属性值为 "103"，Code属性值为 "24"，白天和夜晚描述均为 "Storm to heavy storm"。
     */
    STORM_TO_HEAVY_STORM("暴雨到大暴雨", "103", "24", "Storm to heavy storm", "Storm to heavy storm"),
    /**
     * 表示大暴雨到特大暴雨天气现象。
     * MyCode属性值为 "103", Code属性值为 "25", 白天和夜晚描述均为 "Heavy to severe storm"。
     */
    HEAVY_TO_SEVERE_STORM("大暴雨到特大暴雨", "103", "25", "Heavy to severe storm", "Heavy to severe storm"),
    /**
     * 表示雪天气现象。
     * MyCode属性值为空字符串，Code属性值为 "302"，白天和夜晚描述均为 "Snow"。
     */
    SNOW("雪", "", "302", "Snow", "Snow"),
    /**
     * 表示阵雪天气现象。
     * MyCode属性值为 "105"，Code属性值为 "13"，白天和夜晚描述均为 "Snow flurry"。
     */
    SNOW_FLURRY("阵雪", "105", "13", "Snow flurry", "Snow flurry"),
    /**
     * 表示小雪天气现象。
     * MyCode属性值为 "105"，Code属性值为 "14"，白天和夜晚描述均为 "Light snow"。
     */
    LIGHT_SNOW("小雪", "105", "14", "Light snow", "Light snow"),
    /**
     * 表示中雪天气现象。
     * MyCode属性值为 "105"，Code属性值为 "15"，白天和夜晚描述均为 "Moderate snow"。
     */
    MODERATE_SNOW("中雪", "105", "15", "Moderate snow", "Moderate snow"),
    /**
     * 表示大雪天气现象。
     * MyCode属性值为 "105"，Code属性值为 "16"，白天和夜晚描述均为 "Heavy snow"。
     */
    HEAVY_SNOW("大雪", "105", "16", "Heavy snow", "Heavy snow"),
    /**
     * 表示暴雪天气现象。
     * MyCode属性值为 "105"，Code属性值为 "17"，白天和夜晚描述均为 "Snowstorm"。
     */
    SNOWSTORM("暴雪", "105", "17", "Snowstorm", "Snowstorm"),
    /**
     * 表示雨夹雪天气现象。
     * MyCode属性值为 "105"，Code属性值为 "06"，白天和夜晚描述均为 "Sleet"。
     */
    SLEET("雨夹雪", "105", "06", "Sleet", "Sleet"),
    /**
     * 表示小到中雪天气现象。
     * MyCode属性值为 "105"，Code属性值为 "26"，白天和夜晚描述均为 "Light to moderate snow"。
     */
    LIGHT_TO_MODERATE_SNOW("小到中雪", "105", "26", "Light to moderate snow", "Light to moderate snow"),
    /**
     * 表示中到大雪天气现象。
     * MyCode属性值为 "105", Code属性值为 "27", 白天和夜晚描述均为 "Moderate to heavy snow"。
     */
    MODERATE_TO_HEAVY_SNOW("中到大雪", "105", "27", "Moderate to heavy snow", "Moderate to heavy snow"),
    /**
     * 表示大到暴雪天气现象。
     * MyCode属性值为 "105", Code属性值为 "28", 白天和夜晚描述均为 "Heavy snow to snowstorm"。
     */
    HEAVY_SNOW_TO_SNOWSTORM("大到暴雪", "105", "28", "Heavy snow to snowstorm", "Heavy snow to snowstorm"),
    /**
     * 表示弱高吹雪天气现象。
     * MyCode属性值为 "105"，Code属性值为 "34"，白天和夜晚描述均为 "Weak high blow snow"。
     */
    WEAK_HIGH_BLOW_SNOW("弱高吹雪", "105", "34", "Weak high blow snow", "Weak high blow snow"),
    /**
     * 表示雾天气现象。
     * MyCode属性值为 "104"，Code属性值为 "18"，白天和夜晚描述均为 "Fog"。
     */
    FOG("雾", "104", "18", "Fog", "Fog"),
    /**
     * 表示浓雾天气现象。
     * MyCode属性值为 "104"，Code属性值为 "32"，白天和夜晚描述均为 "Dense fog"。
     */
    DENSE_FOG("浓雾", "104", "32", "Dense fog", "Dense fog"),
    /**
     * 表示轻雾天气现象。
     * MyCode属性值为 "104"，Code属性值为 "35"，白天和夜晚描述均为 "Mist"。
     */
    MIST("轻雾", "104", "35", "Mist", "Mist"),
    /**
     * 表示强浓雾天气现象。
     * MyCode属性值为 "104"，Code属性值为 "49"，白天和夜晚描述均为 "Heavy dense fog"。
     */
    HEAVY_DENSE_FOG("强浓雾", "104", "49", "Heavy dense fog", "Heavy dense fog"),
    /**
     * 表示大雾天气现象。
     * MyCode属性值为 "104"，Code属性值为 "57"，白天和夜晚描述均为 "Heavy fog"。
     */
    HEAVY_FOG("大雾", "104", "57", "Heavy fog", "Heavy fog"),
    /**
     * 表示特强浓雾天气现象。
     * MyCode属性值为 "104"，Code属性值为 "58"，白天和夜晚描述均为 "Extra-heavy dense fog"。
     */
    EXTRA_HEAVY_DENSE_FOG("特强浓雾", "104", "58", "Extra-heavy dense fog", "Extra-heavy dense fog"),
    /**
     * 表示霾天气现象。
     * MyCode属性值为 "106"，Code属性值为 "53"，白天和夜晚描述均为 "Haze"。
     */
    HAZE("霾", "106", "53", "Haze", "Haze"),
    /**
     * 表示中度霾天气现象。
     * MyCode属性值为 "106"，Code属性值为 "54"，白天和夜晚描述均为 "Moderate haze"。
     */
    MODERATE_HAZE("中度霾", "106", "54", "Moderate haze", "Moderate haze"),
    /**
     * 表示重度霾天气现象。
     * MyCode属性值为 "106"，Code属性值为 "55"，白天和夜晚描述均为 "Severe haze"。
     */
    SEVERE_HAZE("重度霾", "106", "55", "Severe haze", "Severe haze"),
    /**
     * 表示严重霾天气现象。
     * MyCode属性值为 "106"，Code属性值为 "56"，白天和夜晚描述均为 "Hazardous haze"。
     */
    HAZARDOUS_HAZE("严重霾", "106", "56", "Hazardous haze", "Hazardous haze"),
    /**
     * 表示浮尘天气现象。
     * MyCode属性值为 "107"，Code属性值为 "29"，白天和夜晚描述均为 "Dust"。
     */
    DUST("浮尘", "107", "29", "Dust", "Dust"),
    /**
     * 表示扬沙天气现象。
     * MyCode属性值为 "107"，Code属性值为 "30"，白天和夜晚描述均为 "Sand"。
     */
    SAND("扬沙", "107", "30", "Sand", "Sand"),
    /**
     * 表示强沙尘暴天气现象。
     * MyCode属性值为 "107"，Code属性值为 "31"，白天和夜晚描述均为 "Sandstorm"。
     */
    SANDSTORM("强沙尘暴", "107", "31", "Sandstorm", "Sandstorm"),
    /**
     * 表示龙卷风天气现象。
     * MyCode属性值为 "107"，Code属性值为 "33"，白天和夜晚描述均为 "Tornado"。
     */
    TORNADO("龙卷风", "107", "33", "Tornado", "Tornado");

    private final String name;
    //MyCode 自定义Code, 百度的Code转换为我们自己的Code,可以做到归类天气返回
    private final String myCode;
    private final String baiduCode;
    private final String day;
    private final String night;

    public static WeatherPhenomenon valueOfName(String name) {
        for (WeatherPhenomenon phenomenon : values()) {
            if (phenomenon.getName().equals(name)) {
                return phenomenon;
            }
        }
        throw new RuntimeException("Unknown weather phenomenon name: " + name);
    }

    public static WeatherPhenomenon valueOfCode(String code) {
        for (WeatherPhenomenon phenomenon : values()) {
            if (phenomenon.getBaiduCode().equals(code)) {
                return phenomenon;
            }
        }
        throw new RuntimeException("Unknown weather phenomenon code: " + code);
    }

    public static WeatherPhenomenon valueOfBaiduCode(String baiduCode) {
        for (WeatherPhenomenon phenomenon : values()) {
            if (phenomenon.getBaiduCode().equals(baiduCode)) {
                return phenomenon;
            }
        }
        throw new RuntimeException("Unknown weather phenomenon baidu code: " + baiduCode);
    }


}