package automation

import (
	"crypto/rand"
	"crypto/sha256"
	"encoding/hex"
	"encoding/json"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/automation/dsl"
)

func validateAutomationRunnerMatchKeys(runnerGroup string, labels []string) error {
	if dsl.IsReservedRunnerGroup(runnerGroup) {
		return invalidArgument("Automation runner group is reserved")
	}
	if len(strings.TrimSpace(runnerGroup)) > dsl.RunnerGroupMaxLength {
		return invalidArgument("Automation runner group exceeds maximum length")
	}
	if len(dsl.RunnerLabelKey(labels)) > dsl.RunnerLabelKeyMaxLength {
		return invalidArgument("Automation runner labels exceed maximum length")
	}
	return nil
}

func validateOptionalJSON(raw string, message string) error {
	if strings.TrimSpace(raw) == "" {
		return nil
	}
	var payload any
	if err := json.Unmarshal([]byte(raw), &payload); err != nil {
		return invalidArgument(message)
	}
	return nil
}

func newAutomationRunnerToken() (string, error) {
	var bytes [32]byte
	if _, err := rand.Read(bytes[:]); err != nil {
		return "", err
	}
	return "wfrt_" + hex.EncodeToString(bytes[:]), nil
}

func automationRunnerTokenHash(token string) string {
	sum := sha256.Sum256([]byte(strings.TrimSpace(token)))
	return hex.EncodeToString(sum[:])
}

func automationRunnerJSON(value any) string {
	bytes, _ := json.Marshal(value)
	return string(bytes)
}
