# Info: KCL Polkadot Zombienet task schemas for provisioning (Provisioning)
# Author: Provisioning System
# Release: 0.0.1
# Date: 2025-07-24

import regex

schema User:
    """
    User settings for Zombienet
    """
    name: str
    group: str = name
    home?: str = "/home/${name}"

schema RelayChainNode:
    """
    Relay chain node configuration
    """
    name: str
    image?: str = "parity/polkadot:latest"
    command?: str = "polkadot"
    args?: [str] = []
    validator: bool = True
    balance?: int = 1000000000000
    
    check:
        len(name) > 0, "Node name cannot be empty"

schema CollatorNode:
    """
    Parachain collator node configuration
    """
    name: str
    image?: str = "parity/polkadot-parachain:latest" 
    command?: str = "polkadot-parachain"
    args?: [str] = []
    balance?: int = 1000000000000
    
    check:
        len(name) > 0, "Collator name cannot be empty"

schema Parachain:
    """
    Parachain configuration
    """
    id: int
    chain?: str
    balance?: int = 1000000
    collators: [CollatorNode] = []
    genesis_wasm?: str
    genesis_state?: str
    
    check:
        1 <= id <= 4000, "Parachain ID must be between 1 and 4000"
        len(collators) > 0, "At least one collator required"

schema RelayChain:
    """
    Relay chain configuration
    """
    chain: "rococo-local" | "westend-local" | "kusama-local" | "polkadot-local" = "rococo-local"
    default_image?: str = "parity/polkadot:latest"
    default_command?: str = "polkadot"
    nodes: [RelayChainNode] = []
    genesis?: str
    runtime_genesis_patch?: str
    
    check:
        len(nodes) >= 2, "At least 2 relay chain nodes required"

schema Settings:
    """
    Zombienet settings configuration
    """
    timeout: int = 1000
    node_spawn_timeout?: int = 300
    provider: "native" | "kubernetes" | "podman" = "native"
    enable_tracing?: bool = False
    backchannel?: bool = True
    
    check:
        timeout > 0, "Timeout must be positive"
        node_spawn_timeout == Undefined or node_spawn_timeout > 0, "Node spawn timeout must be positive"

schema KubernetesProvider:
    """
    Kubernetes provider specific configuration
    """
    namespace?: str = "zombienet"
    monitoring?: bool = True
    prometheus_prefix?: str = "substrate_"
    
schema PodmanProvider:
    """
    Podman provider specific configuration
    """
    monitoring?: bool = True
    monitoring_port?: int = 9090
    
    check:
        monitoring_port == Undefined or (1 <= monitoring_port <= 65535), "Monitoring port must be between 1 and 65535"

schema NativeProvider:
    """
    Native provider specific configuration
    """
    monitoring?: bool = False

schema PolkadotZombienet:
    """
    Polkadot Zombienet configuration
    """
    name: str = "polkadot-zombienet"
    version: str = "1.3.133"
    run_user: User = {
        name = "zombienet"
    }
    work_path: str = "/var/lib/zombienet"
    config_path: str = "/etc/zombienet"
    bin_path: str = "/usr/local/bin"
    zombienet_binary: str = "zombienet"
    networks_path: str = "/var/lib/zombienet/networks"
    binaries_path: str = "/var/lib/zombienet/binaries"
    logs_path: str = "/var/lib/zombienet/logs"
    settings: Settings = {}
    relaychain: RelayChain = {}
    parachains: [Parachain] = []
    kubernetes_config?: KubernetesProvider = {}
    podman_config?: PodmanProvider = {}
    native_config?: NativeProvider = {}
    log_level: "error" | "warn" | "info" | "debug" | "trace" = "info"
    
    check:
        len(run_user.name) > 0, "Check run_user name"
        len(work_path) > 0, "Check work_path"
        len(config_path) > 0, "Check config_path"
        len(relaychain.nodes) >= 2, "At least 2 relay chain nodes required"