package conditions import ( "context" "fmt" "time" "gitea.maximumdirect.net/ejr/weatherapi/internal/application/units" "gitea.maximumdirect.net/ejr/weatherapi/internal/core/ports" "gitea.maximumdirect.net/ejr/weatherapi/internal/platform/constants" "gitea.maximumdirect.net/ejr/weatherfeeder/model" "gitea.maximumdirect.net/ejr/weatherfeeder/standards" ) type Service struct { repo ports.ObservationRepository registry *units.Registry window time.Duration } func NewService(repo ports.ObservationRepository, registry *units.Registry, window time.Duration) *Service { return &Service{repo: repo, registry: registry, window: window} } type Response struct { TemperatureC *float64 `json:"temperatureC,omitempty"` TemperatureF *float64 `json:"temperatureF,omitempty"` ApparentTemperatureC *float64 `json:"apparentTemperatureC,omitempty"` ApparentTemperatureF *float64 `json:"apparentTemperatureF,omitempty"` DewpointC *float64 `json:"dewpointC,omitempty"` DewpointF *float64 `json:"dewpointF,omitempty"` RelativeHumidity *float64 `json:"relativeHumidityPercent,omitempty"` WindSpeedKmh *float64 `json:"windSpeedKmh,omitempty"` WindSpeedMph *float64 `json:"windSpeedMph,omitempty"` WindDirectionDegrees *float64 `json:"windDirectionDegrees,omitempty"` ConditionText *string `json:"conditionText,omitempty"` IsDay *bool `json:"isDay,omitempty"` } func (s *Service) GetCurrent(ctx context.Context, unitSystem string) (Response, error) { if s == nil { return Response{}, fmt.Errorf("conditions service is nil") } converter, err := s.registry.Resolve(unitSystem) if err != nil { return Response{}, err } summary, err := s.repo.GetCurrentConditionsSummary(ctx, s.window) if err != nil { return Response{}, err } resp := Response{ RelativeHumidity: summary.RelativeHumidity, WindDirectionDegrees: summary.WindDirectionDegrees, IsDay: summary.IsDay, } if summary.ConditionCode != nil { resp.ConditionText = ptrString(standards.WMOText(model.WMOCode(*summary.ConditionCode), summary.IsDay)) } switch converter.System() { case constants.UnitSystemUS: resp.TemperatureF = converter.TemperatureCToOutput(summary.TemperatureC) resp.ApparentTemperatureF = converter.TemperatureCToOutput(summary.ApparentTemperatureC) resp.DewpointF = converter.TemperatureCToOutput(summary.DewpointC) resp.WindSpeedMph = converter.SpeedKmhToOutput(summary.WindSpeedKmh) default: resp.TemperatureC = converter.TemperatureCToOutput(summary.TemperatureC) resp.ApparentTemperatureC = converter.TemperatureCToOutput(summary.ApparentTemperatureC) resp.DewpointC = converter.TemperatureCToOutput(summary.DewpointC) resp.WindSpeedKmh = converter.SpeedKmhToOutput(summary.WindSpeedKmh) } return resp, nil } func ptrString(v string) *string { return &v }