79 lines
2.8 KiB
Go
79 lines
2.8 KiB
Go
package changes
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/briefing"
|
|
)
|
|
|
|
func CompareThreeDay(previous briefing.Package, current briefing.Package, thresholds Thresholds) ([]Change, error) {
|
|
if previous.ThreeDay == nil {
|
|
return nil, fmt.Errorf("previous 3-day briefing is required")
|
|
}
|
|
if current.ThreeDay == nil {
|
|
return nil, fmt.Errorf("current 3-day briefing is required")
|
|
}
|
|
previousDays := outlookDaysByDate(previous.ThreeDay.Days)
|
|
currentDays := outlookDaysByDate(current.ThreeDay.Days)
|
|
var changes []Change
|
|
for date, currentDay := range currentDays {
|
|
previousDay, ok := previousDays[date]
|
|
if !ok {
|
|
changes = append(changes, Change{Type: "outlook_day_added", Message: fmt.Sprintf("Outlook day added: %s.", date), Current: date})
|
|
continue
|
|
}
|
|
changes = append(changes, compareOutlookDay(date, previousDay, currentDay, thresholds)...)
|
|
}
|
|
for date := range previousDays {
|
|
if _, ok := currentDays[date]; !ok {
|
|
changes = append(changes, Change{Type: "outlook_day_removed", Message: fmt.Sprintf("Outlook day removed: %s.", date), Previous: date})
|
|
}
|
|
}
|
|
sortChanges(changes)
|
|
return changes, nil
|
|
}
|
|
|
|
func compareOutlookDay(date string, previous briefing.OutlookDay, current briefing.OutlookDay, thresholds Thresholds) []Change {
|
|
var changes []Change
|
|
for _, change := range compareTemperature(previous.Temperature, current.Temperature, thresholds.TemperatureDegrees) {
|
|
change.Message = date + ": " + change.Message
|
|
changes = append(changes, change)
|
|
}
|
|
for _, change := range comparePrecipitation(previous.MaxPrecipitationProbability, current.MaxPrecipitationProbability, thresholds) {
|
|
change.Message = date + ": " + change.Message
|
|
changes = append(changes, change)
|
|
changes[len(changes)-1].Type = "outlook_" + change.Type
|
|
}
|
|
for _, change := range compareWind(previous.PeakWindGust, current.PeakWindGust, float64(thresholds.WindGustMilesPerHour)) {
|
|
change.Message = date + ": " + change.Message
|
|
change.Type = "outlook_" + change.Type
|
|
changes = append(changes, change)
|
|
}
|
|
for _, change := range compareAlerts(previous.RelevantAlerts, current.RelevantAlerts) {
|
|
change.Message = date + ": " + change.Message
|
|
change.Type = "outlook_" + change.Type
|
|
changes = append(changes, change)
|
|
}
|
|
for _, change := range compareIndicators(aggregateIndicators(previous.Dayparts), aggregateIndicators(current.Dayparts)) {
|
|
change.Message = date + ": " + change.Message
|
|
change.Type = "outlook_" + change.Type
|
|
changes = append(changes, change)
|
|
}
|
|
return changes
|
|
}
|
|
|
|
func outlookDaysByDate(days []briefing.OutlookDay) map[string]briefing.OutlookDay {
|
|
out := map[string]briefing.OutlookDay{}
|
|
for _, day := range days {
|
|
date := day.Date
|
|
if date == "" && !day.Period.Start.IsZero() {
|
|
date = day.Period.Start.Format(time.DateOnly)
|
|
}
|
|
if date != "" {
|
|
out[date] = day
|
|
}
|
|
}
|
|
return out
|
|
}
|