#!/usr/bin/env nu
# Thin entry for component commands.
# Bypasses full dispatcher — loads only components/mod.nu + targeted lib_provisioning.
# Mirrors the provisioning-taskserv.nu pattern for <1s startup.

export-env {
    let lib_dirs_raw = ($env.NU_LIB_DIRS? | default "")
    let current_lib_dirs = if ($lib_dirs_raw | type) == "string" {
        if ($lib_dirs_raw | is-empty) { [] } else { ($lib_dirs_raw | split row ":") }
    } else {
        $lib_dirs_raw
    }
    let dynamic = ($env.PROVISIONING? | default "" | path join "core" "nulib")
    $env.NU_LIB_DIRS = ([
        "/opt/provisioning/core/nulib"
        "/usr/local/provisioning/core/nulib"
    ] | append $current_lib_dirs | append (if ($dynamic | is-not-empty) { [$dynamic] } else { [] }))
}

use components/mod.nu [component-list, component-show, component-status]

def main [
    ...args: string
    --workspace (-w): string = ""
    --mode: string = ""
    --ext
    --debug (-x)
]: nothing -> nothing {
    if $debug { $env.PROVISIONING_DEBUG = true }

    # Args come in as: ["component", "ls"] or ["ls", "postgresql"] depending on dispatch
    let rest = if (($args | length) > 0) and (($args | first) in ["component", "comp", "c", "cl"]) {
        $args | skip 1
    } else {
        $args
    }
    let sub = ($rest | get 0? | default "list")
    let name = ($rest | get 1? | default "")

    # Workspace resolution: explicit flag > active env > empty (ext_only view)
    let ws = if ($workspace | is-not-empty) {
        $workspace
    } else {
        $env.PROVISIONING_KLOUD? | default ""
    }

    match $sub {
        "list" | "ls" | "l" => {
            component-list $mode $ws
        }
        "show" | "s" => {
            if ($name | is-empty) {
                print "Error: component show requires a name"
                print "Usage: prvng component show <name> [--workspace <ws>] [--ext]"
                return
            }
            component-show $name $ws $ext
        }
        "status" | "st" => {
            if ($name | is-empty) {
                print "Error: component status requires a name"
                print "Usage: prvng component status <name> [--workspace <ws>]"
                return
            }
            component-status $name $ws
        }
        "help" | "h" | "-h" | "--help" => {
            print "Component Management"
            print "===================="
            print ""
            print "Usage: prvng component <subcommand> [options]"
            print ""
            print "Subcommands:"
            print "  list [--mode taskserv|cluster|container] [--workspace <ws>]  (alias: ls, l)"
            print "  show <name> [--workspace <ws>] [--ext]                        (alias: s)"
            print "  status <name> [--workspace <ws>]                              (alias: st)"
            print ""
            print "Examples:"
            print "  prvng component list"
            print "  prvng component list --mode cluster"
            print "  prvng component show postgresql"
            print "  prvng component status k0s --workspace libre-daoshi"
        }
        _ => {
            print $"Unknown component subcommand: ($sub)"
            print "Run: prvng component help"
        }
    }
}
