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 }