#!/usr/bin/env bash

BASE_URL="https://gist.asfd.cn/jetsung/vscode/raw/HEAD/"
LIST_FILE="index.txt" # 默认扩展 ID 列表文件
DESC_FILE="README.md" # 描述 Markdown 文件
IDE_CMD="code" # 默认 VSCode
FORCE=false
EXTRA=""
VERBOSE=false  # -v: 只显示详细扩展信息（纯文本单行格式），不安装

# 参数解析函数
parameters() {
    while getopts "s:f e:n:v" opt; do
        case $opt in
            s) IDE_CMD="$OPTARG" ;;
            f) FORCE=true ;;
            e) EXTRA="$OPTARG" ;;
            n) LIST_FILE="$OPTARG" ;;
            v) VERBOSE=true ;;
            \?) echo "无效参数: -$OPTARG" >&2; exit 1 ;;
        esac
    done
    shift $((OPTIND-1))
    EXTRA="$EXTRA $@"
}

# 主函数
main() {
    parameters "$@"

    # 处理 LIST_FILE
    if [[ "$LIST_FILE" != "*.*" ]] && [[ "$LIST_FILE" != *.* ]]; then
        LIST_FILE="${LIST_FILE}.txt"
    fi

    URL_DESC="${BASE_URL}${DESC_FILE}"

    if $VERBOSE; then
        # -v 模式：下载 README.md，先提取表格数据行（跳过标题和分隔行），然后逐行处理输出纯文本格式
        curl -s --fail "$URL_DESC" | awk '
        # 只处理数据行：以 "| [**" 开头（名称带链接）
        /^\| \[\*\*/ {
            line = $0

            # 提取名称：去除 [**name**][n]
            if (match(line, /\[\*\*([^*]+)\*\*\]\[\d+\]/)) {
                name = substr(line, RSTART + 3, RLENGTH - 7 - length(match(line, /\[\d+\]/)))  # 调整去除 [n]
                # 更精确：从 ** 后到 ** 前
                sub(/.*\[\*\*/, "", line)
                sub(/\*\*\].*/, "", line)
                name = line
            } else {
                name = ""
            }

            # 重置 line 为原始
            line = $0

            # 提取官方 ID：去除 `
            if (match(line, /`([^`]+)`/)) {
                id_official = substr(line, RSTART + 1, RLENGTH - 2)
            } else {
                id_official = ""
            }

            # 提取其他 ID：第三列，通常 - 
            sub(/.*\| [^|]* \| [^|]* \| /, "", line)  # 临时去除到第三列后
            if (match(line, /^ ([^ |]+) /)) {
                id_other = substr(line, RSTART + 1, RLENGTH - 2)
            } else {
                id_other = "-"
            }

            # 提取描述：第五列（最后一列）
            if (match($0, /\| ([^|]+) \| ([^|]+) \| ([^|]+) \| (.*) \|$/)) {
                desc = substr($0, RSTART + RLENGTH - length($4) - 1)  # 复杂，改用 split
            }

            # 更可靠方式：用 split 分隔 |
            split($0, fields, "|")
            if (length(fields) >= 5) {
                name_field = fields[2]
                gsub(/^[ \t]+|[ \t]+$/, "", name_field)
                gsub(/\[\*\*[^*]+\*\*\]\[\d+\]/, "", name_field)  # 去除链接部分，留空？ 等下已提取name
                # 用之前提取的 name

                id_official_field = fields[3]
                gsub(/^[ \t]+|[ \t]+$/, "", id_official_field)
                gsub(/`/, "", id_official_field)

                id_other_field = fields[4]
                gsub(/^[ \t]+|[ \t]+$/, "", id_other_field)

                desc_field = fields[5]
                gsub(/^[ \t]+|[ \t]+$/, "", desc_field)

                printf "%s %s %s %s\n", name, id_official_field, id_other_field, desc_field
            }
        }'
        exit 0
    fi

    # 非 -v 模式：正常下载 index.txt 并安装
    URL_LIST="${BASE_URL}${LIST_FILE}"

    echo "从 $URL_LIST 下载扩展列表..."
    EXTENSIONS=$(curl -s --fail "$URL_LIST" | grep -v '^#' | grep -v '^$' | sed '/^$/d')

    if [ -z "$EXTENSIONS" ]; then
        echo "错误: 未获取到扩展列表或文件为空！请检查文件名（当前: $LIST_FILE）。" >&2
        exit 1
    fi

    BASE_CMD="$IDE_CMD --install-extension"
    if $FORCE; then
        EXTRA="--force $EXTRA"
    fi

    echo "开始为 $IDE_CMD 安装扩展（命令: $BASE_CMD ... $EXTRA）"
    echo "扩展列表:"
    echo "$EXTENSIONS" | tr ' ' '\n'
    echo "-----------------"

    echo "$EXTENSIONS" | tr ' ' '\n' | while read -r ext; do
        [ -z "$ext" ] && continue
        echo "安装: $ext"
        $BASE_CMD "$ext" $EXTRA || echo "警告: 安装 $ext 失败（可能已安装或 ID 不兼容）"
    done

    echo "-----------------"
    echo "所有扩展安装完成！请重启 IDE 以生效。"
}

main "$@"