#compdef beam

# =============================================================================
# Beam-Go Zsh Completion Script
# =============================================================================

_beam() {
    local context state state_descr line
    typeset -A opt_args

    _arguments -C \
        '1: :_beam_commands' \
        '*:: :->args'

    case $state in
        (args)
            case $line[1] in
                (serve) _beam_serve ;;
                (add)   _beam_add ;;
                (list)  _beam_list ;;
                (del)   _beam_del ;;
            esac
            ;;
    esac
}

# --- Subcommand Definitions ---

(( $+functions[_beam_commands] )) ||
_beam_commands() {
    local -a commands
    commands=(
        'serve:Start the beam server daemon'
        'add:Share a file or directory'
        'list:List active shares'
        'del:Delete a share by path or code'
    )
    _describe -t commands 'beam command' commands
}

_beam_serve() {
    _arguments \
        '(-d --database)'{-d,--database}'=[Database directory (Required)]:directory:_path_files -/' \
        '(-p --port)'{-p,--port}'=[Port to listen on (default :8280)]:port:' \
        '(-s --socket)'{-s,--socket}'=[Socket path]:socket path:_files' \
        '--subpath=[Enable subpath sharing]'
}

_beam_add() {
    _arguments \
        '(-d --days)'{-d,--days}'=[Expiration days (default 7)]:days:' \
        '(-s --socket)'{-s,--socket}'=[Socket path]:socket path:_files' \
        '1:file to share:_files'
}

_beam_list() {
    _arguments \
        '(-s --socket)'{-s,--socket}'=[Socket path]:socket path:_files'
}

_beam_del() {
    _arguments \
        '(-s --socket)'{-s,--socket}'=[Socket path]:socket path:_files' \
        '(-c --code)'{-c,--code}'=[Share code]:share code:_beam_active_codes' \
        '1:shared path:_files'
}

# --- Helpers ---

# 动态获取当前的 Share Code
# 它会尝试读取用户当前输入的 -s 参数，去连接正确的 socket
_beam_active_codes() {
    local socket_path=""

    # 从 Zsh 解析的参数中提取 socket 路径
    if [[ -n ${opt_args[-s]} ]]; then
        socket_path=${opt_args[-s]}
    elif [[ -n ${opt_args[--socket]} ]]; then
        socket_path=${opt_args[--socket]}
    fi

    # 构造查询命令
    local cmd_args=()
    cmd_args+=("list")
    [[ -n $socket_path ]] && cmd_args+=("-s" "$socket_path")

    # 调用 beam list，跳过前两行表头，提取 Code($1) 和 Path($3)
    # 2>/dev/null 防止服务未启动时报错打印到终端
    local -a shares
    shares=("${(@f)$(beam "${cmd_args[@]}" 2>/dev/null | awk 'NR>2 {print $1":"$2" "$3" "$4}')}")

    if [[ ${#shares} -gt 0 ]]; then
        _describe -t shares 'active share' shares
    else
        _message 'no active shares or server not running'
    fi
}

_beam "$@"