#compdef kt
# Zsh completion for kt command
# This is a static completion script that doesn't require Python startup

_kt() {
    local -a commands
    commands=(
        'version:Show version information'
        'run:Start model inference server'
        'chat:Interactive chat with running model'
        'quant:Quantize model weights'
        'bench:Run full benchmark'
        'microbench:Run micro-benchmark'
        'doctor:Diagnose environment issues'
        'model:Manage models and storage paths'
        'config:Manage configuration'
        'sft:Fine-tuning with LlamaFactory'
    )

    local -a run_opts
    run_opts=(
        '--host[Server host]:host:'
        '--port[Server port]:port:'
        '--gpu-experts[Number of GPU experts]:count:'
        '--cpu-threads[Number of CPU threads]:count:'
        '--tensor-parallel-size[Tensor parallel size]:size:'
        '--kt-method[KT method]:method:(AMXINT4 FP8 RAWINT4)'
        '--attention-backend[Attention backend]:backend:(triton flashinfer)'
        '--max-total-tokens[Maximum total tokens]:tokens:'
        '--dry-run[Show command without executing]'
        '--help[Show help message]'
    )

    local -a chat_opts
    chat_opts=(
        '--host[Server host]:host:'
        '--port[Server port]:port:'
        '--model[Model name]:model:'
        '--temperature[Sampling temperature]:temp:'
        '--max-tokens[Maximum tokens]:tokens:'
        '--system[System prompt]:prompt:'
        '--save-history[Save conversation history]'
        '--no-save-history[Do not save history]'
        '--history-file[History file path]:path:_files'
        '--stream[Enable streaming output]'
        '--no-stream[Disable streaming output]'
        '--help[Show help message]'
    )

    local -a model_cmds
    model_cmds=(
        'download:Download a model from HuggingFace'
        'list:List available models'
        'path-list:List all model storage paths'
        'path-add:Add a new model storage path'
        'path-remove:Remove a model storage path'
        'search:Search for models in the registry'
    )

    local -a config_cmds
    config_cmds=(
        'show:Show all configuration'
        'get:Get configuration value'
        'set:Set configuration value'
        'reset:Reset to defaults'
        'path:Show configuration file path'
        'init:Re-run first-time setup wizard'
    )

    local -a sft_cmds
    sft_cmds=(
        'train:Train model'
        'chat:Chat with model'
        'export:Export model'
    )

    _arguments -C \
        '1: :->command' \
        '*::arg:->args'

    case $state in
        command)
            _describe 'kt commands' commands
            _arguments \
                '--help[Show help message]' \
                '--version[Show version]'
            ;;
        args)
            case $words[1] in
                run)
                    _arguments $run_opts \
                        '1:model:'
                    ;;
                chat)
                    _arguments $chat_opts
                    ;;
                quant)
                    _arguments \
                        '--method[Quantization method]:method:' \
                        '--output[Output directory]:path:_files -/' \
                        '--help[Show help message]' \
                        '1:model:_files -/'
                    ;;
                bench|microbench)
                    _arguments \
                        '--model[Model name or path]:model:' \
                        '--config[Config file path]:path:_files' \
                        '--help[Show help message]'
                    ;;
                doctor)
                    _arguments \
                        '--verbose[Verbose output]' \
                        '--help[Show help message]'
                    ;;
                model)
                    _arguments \
                        '1: :->model_cmd' \
                        '*::arg:->model_args'

                    case $state in
                        model_cmd)
                            _describe 'model commands' model_cmds
                            ;;
                    esac
                    ;;
                config)
                    _arguments \
                        '1: :->config_cmd' \
                        '*::arg:->config_args'

                    case $state in
                        config_cmd)
                            _describe 'config commands' config_cmds
                            ;;
                    esac
                    ;;
                sft)
                    _arguments \
                        '1: :->sft_cmd' \
                        '*::arg:->sft_args'

                    case $state in
                        sft_cmd)
                            _describe 'sft commands' sft_cmds
                            ;;
                    esac
                    ;;
            esac
            ;;
    esac
}

_kt "$@"
