use ../workspace/state.nu *
use ../workspace/sync.nu *
use ../lib_provisioning/config/accessor.nu *
use ../lib_provisioning/utils/interface.nu [_print]

# Workspace provisioning state commands.

export def "main state" [
    subcmd?: string
    ...args
    --infra (-i): string     = ""
    --settings (-s): string  = ""
    --server: string         = ""
    --taskserv: string       = ""
    --kubeconfig: string     = ""
    --skip-ssh
    --force (-f)
    --out: string            = ""
] {
    let workspace_path = if ($env.PROVISIONING_WORKSPACE_PATH? | is-not-empty) {
        $env.PROVISIONING_WORKSPACE_PATH
    } else {
        $env.PWD
    }

    match ($subcmd | default "show") {
        "show" | "s" => {
            state-show $workspace_path --server $server
        },

        "init" | "i" => {
            let curr_settings = (find_get_settings --infra $infra --settings $settings)
            state-init $workspace_path $curr_settings
            _print $"State initialized at (state-path $workspace_path)"
        },

        "reset" | "r" => {
            if ($server | is-empty) or ($taskserv | is-empty) {
                error make { msg: "state reset requires --server <hostname> --taskserv <name>" }
            }
            state-node-reset $workspace_path $server $taskserv
            _print $"($server)/($taskserv) reset to pending"
        },

        "migrate" | "m" => {
            state-migrate-from-json $workspace_path
        },

        "sync" => {
            let curr_settings = (find_get_settings --infra $infra --settings $settings)
            state-sync $workspace_path $curr_settings --kubeconfig $kubeconfig --skip-ssh=$skip_ssh
        },

        _ => {
            _print "Usage: provisioning state <subcommand>"
            _print ""
            _print "  show    [--server <hostname>]                  — display state table"
            _print "  init    [--infra <path>]                       — bootstrap state from settings"
            _print "  reset   --server <hostname> --taskserv <name>  — reset node to pending"
            _print "  migrate                                        — migrate .json → .ncl"
            _print "  sync    [--infra <path>] [--kubeconfig <path>] — reconcile from APIs"
        },
    }
}
