# Enhanced create command with better validation and logging

export def "main create enhanced" [
    target?: string      # server (s) | taskserv (t) | cluster (c)
    name?: string       # Target name in settings
    ...args                 # Args for create command 
    --serverpos (-p): int   # Server position in settings 
    --check (-c)            # Only check mode no servers will be created 
    --wait (-w)             # Wait servers to be created 
    --infra (-i): string    # Infra path 
    --settings (-s): string # Settings path 
    --outfile (-o): string  # Output file
    --debug (-x)            # Use Debug mode
    --dry-run              # Show what would be done without executing
    --verbose (-v)         # Verbose output
]: nothing -> nothing {
    
    # Set debug mode
    if $debug { 
        $env.PROVISIONING_DEBUG = true 
        print $"🐛 Debug mode enabled"
    }
    
    # Set output format
    if ($outfile | is-not-empty) {
        $env.PROVISIONING_OUT = $outfile 
        $env.PROVISIONING_NO_TERMINAL = true
    }
    
    # Validate target parameter
    if ($target | is-empty) {
        print $"🛑 Target parameter is required"
        print "💡 Valid targets: server(s), taskserv(t), cluster(cl)"
        print "💡 Example: provisioning create enhanced server my-server"
        exit 1
    }
    
    # Validate target value
    let valid_targets = ["server", "servers", "s", "taskserv", "taskservs", "task", "tasks", "t", "clusters", "cl"]
    let is_valid_target = ($valid_targets | where {|t| $t == $target} | length) > 0
    
    if not $is_valid_target {
        print $"🛑 Invalid target: ($target)"
        print $"💡 Valid targets: ($valid_targets | str join ', ')"
        exit 1
    }
    
    # Log operation start
    print $""
    print $"📋 Creating ($target)"
    print $"─────────────────────────────────────────────────────────────"
    print $"ℹ️  Target: ($target)"
    print $"ℹ️  Name: ($name | default 'default')"
    
    if $dry_run {
        print $"⚠️  DRY RUN MODE - No actual changes will be made"
    }
    
    # Validate settings path if provided
    if ($settings | is-not-empty) {
        if not ($settings | path exists) {
            print $"🛑 Settings file not found: ($settings)"
            exit 1
        }
        print $"ℹ️  Using settings: ($settings)"
    }
    
    # Validate infra path if provided
    if ($infra | is-not-empty) {
        if not ($infra | path exists) {
            print $"🛑 Infra path not found: ($infra)"
            exit 1
        }
        print $"ℹ️  Using infra: ($infra)"
    }
    
    # Execute the appropriate creation command
    let use_debug = if $debug { "-x" } else { "" }
    
    try {
        match $target { 
            "server"| "servers" | "s" => { 
                print $"  📌 Creating server"
                if $dry_run {
                    print $"ℹ️  Would execute: server creation command"
                } else {
                    ^$"($env.PROVISIONING_NAME)" $use_debug -mod "server" ($env.PROVISIONING_ARGS | str replace $target '') --notitles
                }
            },
            "taskserv" | "taskservs" | "task" | "tasks" | "t" => { 
                print $"  📌 Creating taskserv"
                let ops = ($env.PROVISIONING_ARGS | split row " ")
                let task = ($ops | get -o 0 | default "")
                if $dry_run {
                    print $"ℹ️  Would execute: taskserv creation for task ($task)"
                } else {
                    ^$"($env.PROVISIONING_NAME)" $use_debug -mod "taskserv" $task ($env.PROVISIONING_ARGS | str replace $"($task) ($target)" '') --notitles
                }
            },
            "clusters"| "clusters" | "cl" => { 
                print $"  📌 Creating cluster"
                if $dry_run {
                    print $"ℹ️  Would execute: cluster creation command"
                } else {
                    ^$"($env.PROVISIONING_NAME)" $use_debug -mod "cluster" ($env.PROVISIONING_ARGS | str replace $target '') --notitles
                }
            }
        }
        
        if not $dry_run {
            print $"✅ Successfully created ($target)"
        } else {
            print $"✅ Dry run completed successfully"
        }
        
    } catch {|err|
        print $"🛑 Failed to create ($target)"
        print $"   Details: ($err.msg)"
        exit 1
    }
}

# Helper function to validate server configuration
export def validate-server-config [
    server_config: record
]: bool {
    let required_fields = ["hostname", "ip", "provider"]
    let missing_fields = ($required_fields | where {|field| 
        ($server_config | get -o $field | is-empty)
    })
    
    if ($missing_fields | length) > 0 {
        print $"🛑 Missing required server configuration fields"
        $missing_fields | each {|field| 
            print $"  - ($field)"
        }
        return false
    }
    
    print $"✅ Server configuration is valid"
    true
}

# Helper function to show creation progress
export def show-creation-progress [
    current: int
    total: int
    operation: string
] {
    let percent = (($current * 100) / $total)
    print $"📊 ($operation) ($percent)%"
} 