package standards import ( "fmt" "gitea.maximumdirect.net/ejr/weatherfeeder/model" ) type WMODescription struct { Day string Night string } // WMODescriptions is the canonical internal mapping of WMO code -> day/night text. // These are used to populate model.WeatherObservation.ConditionText. var WMODescriptions = map[model.WMOCode]WMODescription{ 0: {Day: "Sunny", Night: "Clear"}, 1: {Day: "Mainly Sunny", Night: "Mainly Clear"}, 2: {Day: "Partly Cloudy", Night: "Partly Cloudy"}, 3: {Day: "Cloudy", Night: "Cloudy"}, 45: {Day: "Foggy", Night: "Foggy"}, 48: {Day: "Rime Fog", Night: "Rime Fog"}, 51: {Day: "Light Drizzle", Night: "Light Drizzle"}, 53: {Day: "Drizzle", Night: "Drizzle"}, 55: {Day: "Heavy Drizzle", Night: "Heavy Drizzle"}, 56: {Day: "Light Freezing Drizzle", Night: "Light Freezing Drizzle"}, 57: {Day: "Freezing Drizzle", Night: "Freezing Drizzle"}, 61: {Day: "Light Rain", Night: "Light Rain"}, 63: {Day: "Rain", Night: "Rain"}, 65: {Day: "Heavy Rain", Night: "Heavy Rain"}, 66: {Day: "Light Freezing Rain", Night: "Light Freezing Rain"}, 67: {Day: "Freezing Rain", Night: "Freezing Rain"}, 71: {Day: "Light Snow", Night: "Light Snow"}, 73: {Day: "Snow", Night: "Snow"}, 75: {Day: "Heavy Snow", Night: "Heavy Snow"}, 77: {Day: "Snow Grains", Night: "Snow Grains"}, 80: {Day: "Light Showers", Night: "Light Showers"}, 81: {Day: "Showers", Night: "Showers"}, 82: {Day: "Heavy Showers", Night: "Heavy Showers"}, 85: {Day: "Light Snow Showers", Night: "Light Snow Showers"}, 86: {Day: "Snow Showers", Night: "Snow Showers"}, 95: {Day: "Thunderstorm", Night: "Thunderstorm"}, 96: {Day: "Light Thunderstorms With Hail", Night: "Light Thunderstorms With Hail"}, 99: {Day: "Thunderstorm With Hail", Night: "Thunderstorm With Hail"}, } // WMOText returns the canonical text description for a WMO code. // If isDay is nil, it prefers the Day description (if present). // // This is intended to be used by drivers after they set ConditionCode. func WMOText(code model.WMOCode, isDay *bool) string { if code == model.WMOUnknown { return "Unknown" } desc, ok := WMODescriptions[code] if !ok { // Preserve the code in the message so it's diagnosable. return fmt.Sprintf("Unknown (WMO %d)", int(code)) } // If day/night is unknown, default to Day if it exists. if isDay == nil { if desc.Day != "" { return desc.Day } if desc.Night != "" { return desc.Night } return fmt.Sprintf("Unknown (WMO %d)", int(code)) } if *isDay { if desc.Day != "" { return desc.Day } // Fallback if desc.Night != "" { return desc.Night } return fmt.Sprintf("Unknown (WMO %d)", int(code)) } // Night if desc.Night != "" { return desc.Night } // Fallback if desc.Day != "" { return desc.Day } return fmt.Sprintf("Unknown (WMO %d)", int(code)) } // IsKnownWMO returns true if the code exists in our mapping table. func IsKnownWMO(code model.WMOCode) bool { if code == model.WMOUnknown { return false } _, ok := WMODescriptions[code] return ok }