package grpc import ( "context" hav1 "gitea.nik4nao.com/nik/home-services/gen/ha/v1" "gitea.nik4nao.com/nik/home-services/ha-gateway/internal/core/domain" "gitea.nik4nao.com/nik/home-services/ha-gateway/internal/core/ports/driving" ) type ClimateGRPC struct { hav1.UnimplementedClimateServiceServer svc driving.ClimateService } // NewClimateGRPC constructs the gRPC adapter for ClimateService. func NewClimateGRPC(svc driving.ClimateService) *ClimateGRPC { return &ClimateGRPC{svc: svc} } // ListClimates returns discovery-oriented climate metadata for clients. func (h *ClimateGRPC) ListClimates(ctx context.Context, req *hav1.ListClimatesRequest) (*hav1.ListClimatesResponse, error) { climates, err := h.svc.ListClimates(ctx) if err != nil { return nil, grpcError(err) } out := make([]*hav1.ClimateEntity, 0, len(climates)) for _, c := range climates { out = append(out, domainClimateToProto(c)) } return &hav1.ListClimatesResponse{Climates: out}, nil } // TurnOn maps a protobuf turn-on request into a domain entity ID. func (h *ClimateGRPC) TurnOn(ctx context.Context, req *hav1.ClimateRequest) (*hav1.ClimateResponse, error) { s, err := h.svc.TurnOn(ctx, domain.EntityID(req.EntityId)) if err != nil { return nil, grpcError(err) } return &hav1.ClimateResponse{State: domainStateToProto(s)}, nil } // TurnOff maps a protobuf turn-off request into a domain entity ID. func (h *ClimateGRPC) TurnOff(ctx context.Context, req *hav1.ClimateRequest) (*hav1.ClimateResponse, error) { s, err := h.svc.TurnOff(ctx, domain.EntityID(req.EntityId)) if err != nil { return nil, grpcError(err) } return &hav1.ClimateResponse{State: domainStateToProto(s)}, nil } // IncreaseTemperature forwards a temperature step-up request to the domain service. func (h *ClimateGRPC) IncreaseTemperature(ctx context.Context, req *hav1.ClimateRequest) (*hav1.ClimateResponse, error) { s, err := h.svc.IncreaseTemperature(ctx, domain.EntityID(req.EntityId)) if err != nil { return nil, grpcError(err) } return &hav1.ClimateResponse{State: domainStateToProto(s)}, nil } // DecreaseTemperature forwards a temperature step-down request to the domain service. func (h *ClimateGRPC) DecreaseTemperature(ctx context.Context, req *hav1.ClimateRequest) (*hav1.ClimateResponse, error) { s, err := h.svc.DecreaseTemperature(ctx, domain.EntityID(req.EntityId)) if err != nil { return nil, grpcError(err) } return &hav1.ClimateResponse{State: domainStateToProto(s)}, nil } // SetTemperature forwards an absolute target-temperature request to the domain service. func (h *ClimateGRPC) SetTemperature(ctx context.Context, req *hav1.SetTemperatureRequest) (*hav1.ClimateResponse, error) { s, err := h.svc.SetTemperature(ctx, domain.EntityID(req.EntityId), req.TargetTemperature) if err != nil { return nil, grpcError(err) } return &hav1.ClimateResponse{State: domainStateToProto(s)}, nil } // SetHVACMode forwards an HVAC mode change request to the domain service. func (h *ClimateGRPC) SetHVACMode(ctx context.Context, req *hav1.SetHVACModeRequest) (*hav1.ClimateResponse, error) { s, err := h.svc.SetHVACMode(ctx, domain.EntityID(req.EntityId), req.HvacMode) if err != nil { return nil, grpcError(err) } return &hav1.ClimateResponse{State: domainStateToProto(s)}, nil }