package briefing import ( "fmt" "gitea.maximumdirect.net/eric/weatherreporter/internal/module" "gitea.maximumdirect.net/eric/weatherreporter/internal/weatherdata" ) const defaultSPCConvectiveDiscussionMinimumSeverityRank = 3 type SPCConvectiveDiscussionModule struct { IncludedBecause string `json:"included_because"` Discussions []SPCConvectiveDiscussionRecord `json:"discussions"` } type SPCConvectiveDiscussionRecord struct { Day int `json:"day,omitempty"` Headline string `json:"headline,omitempty"` Summary string `json:"summary,omitempty"` Discussion string `json:"discussion,omitempty"` UpdatedAt string `json:"updated_at,omitempty"` } func buildSPCConvectiveDiscussionModule(ctx ModuleContext, _ any) (*module.Output, error) { if !hasSPCConvectiveDiscussionThreshold(ctx.Derived.SPCConvectiveOutlooks) { return nil, nil } records := spcConvectiveDiscussionRecords(ctx.Derived.SPCConvectiveOutlooks, ctx.Derived.SPCConvectiveDiscussions, ctx.Timezone) if len(records) == 0 { return nil, nil } value := SPCConvectiveDiscussionModule{ IncludedBecause: fmt.Sprintf("severity_rank >= %d", defaultSPCConvectiveDiscussionMinimumSeverityRank), Discussions: records, } return &module.Output{ID: module.SPCConvectiveDiscussion, StanzaName: string(module.SPCConvectiveDiscussion), Value: value}, nil } func hasSPCConvectiveDiscussionThreshold(outlooks []weatherdata.ConvectiveOutlook) bool { for _, outlook := range outlooks { if outlook.SeverityRank != nil && *outlook.SeverityRank >= defaultSPCConvectiveDiscussionMinimumSeverityRank { return true } } return false } func spcConvectiveDiscussionRecords(outlooks []weatherdata.ConvectiveOutlook, discussions []weatherdata.ConvectiveOutlookDiscussion, timezone string) []SPCConvectiveDiscussionRecord { retainedDays := map[int]struct{}{} for _, outlook := range outlooks { retainedDays[outlook.Day] = struct{}{} } records := make([]SPCConvectiveDiscussionRecord, 0, len(discussions)) for _, discussion := range discussions { if _, ok := retainedDays[discussion.Day]; !ok { continue } if discussion.Discussion == "" { continue } records = append(records, SPCConvectiveDiscussionRecord{ Day: discussion.Day, Headline: discussion.Headline, Summary: discussion.Summary, Discussion: discussion.Discussion, UpdatedAt: friendlyOptionalTime(discussion.UpdatedAt, timezone), }) } return records }