package runtimecontrol

import (
	"context"
	"strings"
)

// RemoteRequestOrigin is a low-cardinality marker for the server-side request
// path that initiated Desktop-bound remote work.
type RemoteRequestOrigin string

const (
	RemoteRequestOriginBackground      RemoteRequestOrigin = "background"
	RemoteRequestOriginUserInteractive RemoteRequestOrigin = "user_interactive"
	RemoteRequestOriginSystemInternal  RemoteRequestOrigin = "system_internal"
)

const (
	RemoteRequestCauseUnknown          = "unknown"
	RemoteRequestCauseWebAPI           = "web_api"
	RemoteRequestCauseTaskScope        = "task_scope"
	RemoteRequestCauseServiceAgentTeam = "service_agentteam"
)

// RemoteRequestContext carries only low-cardinality request-origin data. It
// intentionally excludes user IDs, workspace IDs, agent IDs, paths, and other
// dimensions that would make later warm-pool metrics or leases high-cardinality.
type RemoteRequestContext struct {
	Origin RemoteRequestOrigin
	Cause  string
}

type remoteRequestContextKey struct{}

// RemoteRequestContextFromContext returns the remote request marker attached to
// ctx. Missing, nil, or malformed markers always collapse to background/unknown
// so background jobs cannot accidentally look user-active.
func RemoteRequestContextFromContext(ctx context.Context) RemoteRequestContext {
	if ctx == nil {
		return normalizeRemoteRequestContext(RemoteRequestContext{})
	}
	request, _ := ctx.Value(remoteRequestContextKey{}).(RemoteRequestContext)
	return normalizeRemoteRequestContext(request)
}

// WithRemoteRequestContext stores a normalized remote request marker on ctx.
func WithRemoteRequestContext(ctx context.Context, request RemoteRequestContext) context.Context {
	if ctx == nil {
		ctx = context.Background()
	}
	return context.WithValue(ctx, remoteRequestContextKey{}, normalizeRemoteRequestContext(request))
}

func normalizeRemoteRequestContext(request RemoteRequestContext) RemoteRequestContext {
	return RemoteRequestContext{
		Origin: normalizeRemoteRequestOrigin(request.Origin),
		Cause:  normalizeRemoteRequestCause(request.Cause),
	}
}

func normalizeRemoteRequestOrigin(origin RemoteRequestOrigin) RemoteRequestOrigin {
	switch origin {
	case RemoteRequestOriginUserInteractive, RemoteRequestOriginSystemInternal:
		return origin
	case RemoteRequestOriginBackground:
		return RemoteRequestOriginBackground
	default:
		return RemoteRequestOriginBackground
	}
}

func normalizeRemoteRequestCause(cause string) string {
	trimmed := strings.TrimSpace(cause)
	switch trimmed {
	case RemoteRequestCauseWebAPI, RemoteRequestCauseTaskScope, RemoteRequestCauseServiceAgentTeam:
		return trimmed
	case RemoteRequestCauseUnknown, "":
		return RemoteRequestCauseUnknown
	default:
		return RemoteRequestCauseUnknown
	}
}
