"""
VAPORA Agent Pools Configuration
Defines scaling policies and configurations for each of the 12 agent roles
"""

import k.api.all as k

# ===== AGENT POOL DEFINITIONS =====

agent_pools = {
    "architect": {
        role = "Architect"
        description = "System design and architecture decisions"
        llm = "Claude Opus"
        parallelizable = false  # Initiator role, must run sequentially
        min_replicas = 2
        max_replicas = 5
        target_cpu = 70
        cpu_request = "2000m"
        memory_request = "4Gi"
        cpu_limit = "4000m"
        memory_limit = "8Gi"
    }
    "developer": {
        role = "Developer"
        description = "Code implementation"
        llm = "Claude Sonnet"
        parallelizable = true
        min_replicas = 5
        max_replicas = 20
        target_cpu = 60
        cpu_request = "2000m"
        memory_request = "3Gi"
        cpu_limit = "4000m"
        memory_limit = "6Gi"
    }
    "code_reviewer": {
        role = "CodeReviewer"
        description = "Code quality and review"
        llm = "Claude Sonnet"
        parallelizable = true
        min_replicas = 3
        max_replicas = 10
        target_cpu = 65
        cpu_request = "1500m"
        memory_request = "2Gi"
        cpu_limit = "3000m"
        memory_limit = "4Gi"
    }
    "tester": {
        role = "Tester"
        description = "Test writing and validation"
        llm = "Claude Sonnet"
        parallelizable = true
        min_replicas = 3
        max_replicas = 10
        target_cpu = 70
        cpu_request = "2000m"
        memory_request = "3Gi"
        cpu_limit = "4000m"
        memory_limit = "6Gi"
    }
    "documenter": {
        role = "Documenter"
        description = "Documentation and guides"
        llm = "GPT-4"
        parallelizable = true
        min_replicas = 2
        max_replicas = 8
        target_cpu = 50
        cpu_request = "1000m"
        memory_request = "2Gi"
        cpu_limit = "2000m"
        memory_limit = "4Gi"
    }
    "marketer": {
        role = "Marketer"
        description = "Marketing content and campaigns"
        llm = "Claude Sonnet"
        parallelizable = true
        min_replicas = 1
        max_replicas = 5
        target_cpu = 40
        cpu_request = "1000m"
        memory_request = "2Gi"
        cpu_limit = "2000m"
        memory_limit = "4Gi"
    }
    "presenter": {
        role = "Presenter"
        description = "Presentations and slides"
        llm = "Claude Sonnet"
        parallelizable = true
        min_replicas = 1
        max_replicas = 3
        target_cpu = 50
        cpu_request = "1000m"
        memory_request = "2Gi"
        cpu_limit = "2000m"
        memory_limit = "4Gi"
    }
    "devops": {
        role = "DevOps"
        description = "CI/CD and deployment"
        llm = "Claude Sonnet"
        parallelizable = true
        min_replicas = 2
        max_replicas = 8
        target_cpu = 60
        cpu_request = "1500m"
        memory_request = "2Gi"
        cpu_limit = "3000m"
        memory_limit = "4Gi"
    }
    "monitor": {
        role = "Monitor"
        description = "Health checking and alerting"
        llm = "Gemini Flash"
        parallelizable = true  # Real-time monitoring
        min_replicas = 2
        max_replicas = 5
        target_cpu = 30
        cpu_request = "1000m"
        memory_request = "1Gi"
        cpu_limit = "2000m"
        memory_limit = "2Gi"
    }
    "security": {
        role = "Security"
        description = "Security audit and verification"
        llm = "Claude Opus"
        parallelizable = false  # Can block pipeline
        min_replicas = 2
        max_replicas = 5
        target_cpu = 70
        cpu_request = "2000m"
        memory_request = "4Gi"
        cpu_limit = "4000m"
        memory_limit = "8Gi"
    }
    "project_manager": {
        role = "ProjectManager"
        description = "Project tracking and roadmap"
        llm = "Claude Sonnet"
        parallelizable = true
        min_replicas = 1
        max_replicas = 3
        target_cpu = 40
        cpu_request = "1000m"
        memory_request = "2Gi"
        cpu_limit = "2000m"
        memory_limit = "4Gi"
    }
    "decision_maker": {
        role = "DecisionMaker"
        description = "Conflict resolution and decisions"
        llm = "Claude Opus"
        parallelizable = false  # On-demand decision making
        min_replicas = 1
        max_replicas = 3
        target_cpu = 70
        cpu_request = "2000m"
        memory_request = "4Gi"
        cpu_limit = "4000m"
        memory_limit = "8Gi"
    }
}

# ===== HORIZONTAL POD AUTOSCALERS =====

hpas = [
    {
        name = "vapora-agents-developer-hpa"
        target_deployment = "vapora-agents"
        agent_role = "developer"
        min_replicas = 5
        max_replicas = 20
        target_cpu_utilization = 60
        metrics = [
            {
                type = "Resource"
                resource = {
                    name = "cpu"
                    target = {type = "Utilization", averageUtilization = 60}
                }
            },
            {
                type = "Pods"
                pods = {
                    metric = {name = "agent_queue_depth"}
                    target = {type = "AverageValue", averageValue = "50"}
                }
            }
        ]
    }
    {
        name = "vapora-agents-reviewer-hpa"
        target_deployment = "vapora-agents"
        agent_role = "code_reviewer"
        min_replicas = 3
        max_replicas = 10
        target_cpu_utilization = 65
    }
    {
        name = "vapora-agents-monitor-hpa"
        target_deployment = "vapora-agents"
        agent_role = "monitor"
        min_replicas = 2
        max_replicas = 5
        target_cpu_utilization = 30
    }
]

# ===== POD DISRUPTION BUDGETS =====

pod_disruption_budgets = [
    {
        name = "vapora-agents-pdb"
        selector = {matchLabels = {"app": "vapora-agents"}}
        minAvailable = 2  # Always keep at least 2 agents running
    }
    {
        name = "surrealdb-pdb"
        selector = {matchLabels = {"app": "surrealdb"}}
        minAvailable = 2  # Database must always have 2+ replicas
    }
]

# ===== NETWORK POLICIES FOR AGENTS =====

network_policies = [
    {
        name = "allow-agent-to-nats"
        ingress = [{
            from = [{podSelector = {matchLabels = {"app": "vapora-agents"}}}]
            ports = [{protocol = "TCP", port = 4222}]
        }]
        egress = [{
            to = [{podSelector = {matchLabels = {"app": "nats"}}}]
            ports = [{protocol = "TCP", port = 4222}]
        }]
    }
    {
        name = "allow-agent-to-database"
        ingress = [{
            from = [{podSelector = {matchLabels = {"app": "vapora-agents"}}}]
            ports = [{protocol = "TCP", port = 8000}]
        }]
        egress = [{
            to = [{podSelector = {matchLabels = {"app": "surrealdb"}}}]
            ports = [{protocol = "TCP", port = 8000}]
        }]
    }
]

# ===== OUTPUT =====

output = {
    agent_pools = agent_pools
    hpas = hpas
    pdbs = pod_disruption_budgets
    network_policies = network_policies
}
