package automation

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

const (
	defaultMaxAutomationSourceBytes  = 256 * 1024
	defaultMaxAutomationJobs         = 256
	defaultMaxAutomationStepsPerJob  = 200
	defaultMaxRunInputBytes          = 64 * 1024
	defaultMaxJobInputBytes          = 128 * 1024
	defaultMaxLogChunkBytes          = 64 * 1024
	defaultMaxArtifactBytes          = int64(16 * 1024 * 1024)
	defaultMaxRunnerLabels           = 8
	defaultMaxActiveRunsPerWorkspace = 1000
)

// AutomationLimits bounds per-request and per-run automation runtime costs.
type AutomationLimits struct {
	MaxAutomationSourceBytes  int
	MaxAutomationJobs         int
	MaxAutomationStepsPerJob  int
	MaxRunInputBytes          int
	MaxJobInputBytes          int
	MaxLogChunkBytes          int
	MaxArtifactBytes          int64
	MaxRunnerLabels           int
	MaxActiveRunsPerWorkspace int
}

func defaultAutomationLimits() AutomationLimits {
	return AutomationLimits{
		MaxAutomationSourceBytes:  defaultMaxAutomationSourceBytes,
		MaxAutomationJobs:         defaultMaxAutomationJobs,
		MaxAutomationStepsPerJob:  defaultMaxAutomationStepsPerJob,
		MaxRunInputBytes:          defaultMaxRunInputBytes,
		MaxJobInputBytes:          defaultMaxJobInputBytes,
		MaxLogChunkBytes:          defaultMaxLogChunkBytes,
		MaxArtifactBytes:          defaultMaxArtifactBytes,
		MaxRunnerLabels:           defaultMaxRunnerLabels,
		MaxActiveRunsPerWorkspace: defaultMaxActiveRunsPerWorkspace,
	}
}

func normalizeAutomationLimits(limits AutomationLimits) AutomationLimits {
	defaults := defaultAutomationLimits()
	if limits.MaxAutomationSourceBytes <= 0 {
		limits.MaxAutomationSourceBytes = defaults.MaxAutomationSourceBytes
	}
	if limits.MaxAutomationJobs <= 0 {
		limits.MaxAutomationJobs = defaults.MaxAutomationJobs
	}
	if limits.MaxAutomationStepsPerJob <= 0 {
		limits.MaxAutomationStepsPerJob = defaults.MaxAutomationStepsPerJob
	}
	if limits.MaxRunInputBytes <= 0 {
		limits.MaxRunInputBytes = defaults.MaxRunInputBytes
	}
	if limits.MaxJobInputBytes <= 0 {
		limits.MaxJobInputBytes = defaults.MaxJobInputBytes
	}
	if limits.MaxLogChunkBytes <= 0 {
		limits.MaxLogChunkBytes = defaults.MaxLogChunkBytes
	}
	if limits.MaxArtifactBytes <= 0 {
		limits.MaxArtifactBytes = defaults.MaxArtifactBytes
	}
	if limits.MaxRunnerLabels <= 0 || limits.MaxRunnerLabels > defaultMaxRunnerLabels {
		limits.MaxRunnerLabels = defaults.MaxRunnerLabels
	}
	if limits.MaxActiveRunsPerWorkspace <= 0 {
		limits.MaxActiveRunsPerWorkspace = defaults.MaxActiveRunsPerWorkspace
	}
	return limits
}

func (limits AutomationLimits) validationLimits() dsl.ValidationLimits {
	normalized := normalizeAutomationLimits(limits)
	return dsl.ValidationLimits{
		MaxJobs:          normalized.MaxAutomationJobs,
		MaxStepsPerJob:   normalized.MaxAutomationStepsPerJob,
		MaxRunnerLabels:  normalized.MaxRunnerLabels,
		MaxJobInputBytes: normalized.MaxJobInputBytes,
	}
}
