package eirb.pg203.weather.data; import java.time.Instant; import java.util.Locale; import org.json.JSONObject; import eirb.pg203.weather.utils.City; public class WeatherData { public enum Condition { SUNNY("☀️"), PARTIAL("🌤"), CLOUDY("☁️"), RAINY("🌧"), ERROR("E"); private String desc; Condition(String desc) { this.desc = desc; } public static Condition fromString(String desc) { switch (desc) { case "☀️": return SUNNY; case "🌤": return PARTIAL; case "☁️": return CLOUDY; case "🌧": return RAINY; default: return ERROR; } } @Override public String toString() { return this.desc; } } enum WindDirection { N("🡩"), NE("🡭"), E("🡪"), SE("🡮"), S("🡫"), SW("🡯"), W("🡨"), NW("🡬"), ERROR("E"); public static WindDirection fromString(String desc) { switch (desc) { case "🡩": return N; case "🡭": return NE; case "🡪": return E; case "🡮": return SE; case "🡫": return S; case "🡯": return SW; case "🡨": return W; case "🡬": return NW; default: return ERROR; } } private String desc; WindDirection(String desc) {this.desc = desc;} @Override public String toString(){ return this.desc;}; } private City city; private Instant date; private float temp; private Condition condition; // cloudly, sunny ... private float windSpeed; private float windDirectionAngle; private WindDirection windDirection; private WindDirection getWindDirection(float windDirectionAngle) { if ((windDirectionAngle >= 337.5 && windDirectionAngle <= 360) || (windDirectionAngle >= 0 && windDirectionAngle <= 22.5)) return WindDirection.N; if (windDirectionAngle > 22.5 && windDirectionAngle <= 67.5) return WindDirection.NE; if (windDirectionAngle > 67.5 && windDirectionAngle <= 112.5) return WindDirection.E; if (windDirectionAngle > 112.5 && windDirectionAngle <= 157.5) return WindDirection.SE; if (windDirectionAngle > 157.5 && windDirectionAngle <= 202.5) return WindDirection.S; if (windDirectionAngle > 202.5 && windDirectionAngle <= 247.5) return WindDirection.SW; if (windDirectionAngle > 247.5 && windDirectionAngle <= 292.5) return WindDirection.W; if (windDirectionAngle > 292.5 && windDirectionAngle <= 337.5) return WindDirection.NW; return WindDirection.ERROR; } public WeatherData(City city, Instant date, float temp, float windSpeed, float windDirectionAngle, Condition condition) { this.city = city; this.date = date; this.temp = temp; this.condition = condition; this.windSpeed = windSpeed; this.windDirectionAngle = windDirectionAngle; this.windDirection = this.getWindDirection(windDirectionAngle); } public City getCity() { return city; } public Instant getDate() { return date; } public Condition getCondition() { return condition; } public float getTemp() { return temp; } public float getWindSpeed() { return windSpeed; } public float getWindDirectionAngle() {return this.windDirectionAngle;} public WindDirection getWindDirection() { return windDirection; } public void setCity(City city) { this.city = city; } public void setDate(Instant date) { this.date = date; } public void setCondition(Condition condition) { this.condition = condition; } public void setTemp(float temp) { this.temp = temp; } public void setWindSpeed(float windSpeed) { this.windSpeed = windSpeed; } public void setWindDirectionAngle(float windDirectionAngle) { this.windDirectionAngle = windDirectionAngle; this.windDirection = this.getWindDirection(windDirectionAngle); } @Override public String toString() { return String.format(Locale.ENGLISH, "%05.2f° %s %05.2fkm/h %06.2f° %s", this.getTemp(), this.getCondition().toString(), this.getWindSpeed(), this.getWindDirectionAngle(), this.getWindDirection().toString() ); } public JSONObject toJSON() { JSONObject jsonObject = new JSONObject(); jsonObject.put("city", city.getCityName()); jsonObject.put("date", date.toEpochMilli()); jsonObject.put("temp", temp); jsonObject.put("condition", condition.toString()); jsonObject.put("windSpeed", windSpeed); jsonObject.put("windDirectionAngle", windDirectionAngle); jsonObject.put("windDirection", windDirection.toString()); return jsonObject; } public static WeatherData fromJSON(JSONObject data) { City city = new City(data.getString("city")); Instant date = Instant.ofEpochMilli(data.getLong("date")); float temp = data.getFloat("temp"); float windSpeed = data.getFloat("windSpeed"); float windDirectionAngle = data.getFloat("windDirectionAngle"); Condition condition = Condition.fromString(data.getString("windDirection")); return new WeatherData(city, date, temp, windSpeed, windDirectionAngle, condition); } }