2024-12-17 17:25:14 +01:00

216 lines
4.9 KiB
Java

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);
}
}