package app import ( "context" "gitea.nik4nao.com/nik/home-services/ha-gateway/internal/core/domain" "gitea.nik4nao.com/nik/home-services/ha-gateway/internal/core/ports/driven" ) type LightApp struct { ha driven.HAClient } func NewLightApp(ha driven.HAClient) *LightApp { return &LightApp{ha: ha} } func (a *LightApp) TurnOn(ctx context.Context, p domain.TurnOnParams) (*domain.EntityState, error) { payload := map[string]any{"entity_id": string(p.EntityID)} if p.BrightnessPct != nil { payload["brightness_pct"] = *p.BrightnessPct } if p.ColorTempKelvin != nil { payload["color_temp_kelvin"] = *p.ColorTempKelvin } if p.RGBColor != nil { payload["rgb_color"] = []uint8{p.RGBColor.R, p.RGBColor.G, p.RGBColor.B} } if p.Transition != nil { payload["transition"] = *p.Transition } return a.callService(ctx, "light", "turn_on", payload) } func (a *LightApp) TurnOff(ctx context.Context, p domain.TurnOffParams) (*domain.EntityState, error) { payload := map[string]any{"entity_id": string(p.EntityID)} if p.Transition != nil { payload["transition"] = *p.Transition } return a.callService(ctx, "light", "turn_off", payload) } func (a *LightApp) Toggle(ctx context.Context, id domain.EntityID) (*domain.EntityState, error) { payload := map[string]any{"entity_id": string(id)} return a.callService(ctx, "light", "toggle", payload) } func (a *LightApp) callService(ctx context.Context, svcDomain, service string, payload map[string]any) (*domain.EntityState, error) { states, err := a.ha.CallService(ctx, svcDomain, service, payload) if err != nil { return nil, err } entityID, _ := payload["entity_id"].(string) for _, s := range states { if s.EntityID == entityID { return haStateToDomain(s), nil } } // HA may return an empty list on success; fall back to GetState. s, err := a.ha.GetState(ctx, entityID) if err != nil { return nil, err } return haStateToDomain(s), nil }