#!/usr/bin/env bash

BASE_URL="https://gist.asfd.cn/jetsung/vscode/raw/HEAD/"
DESC_FILE="README.md"
IDE_CMD="code"
FORCE=false
EXTRA=""
VERBOSE=false

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

extract_extensions() {
    local content
    if [[ "$DESC_FILE" == http* ]]; then
        content=$(curl -s --fail "$DESC_FILE")
    elif [[ -f "$DESC_FILE" ]]; then
        content=$(cat "$DESC_FILE")
    else
        content=$(curl -s --fail "${BASE_URL}${DESC_FILE}")
    fi

    if [ $? -ne 0 ] || [ -z "$content" ]; then
        echo "错误：无法加载 README 文件（$DESC_FILE）" >&2
        exit 1
    fi

    echo "$content" | awk '
    BEGIN {
        in_table = 0
    }
    # 检测表头行
    /^\|/ && $0 ~ /\| 名称 \| 扩展 ID \|/ {
        in_table = 1
        next
    }
    # 跳过分隔行（如 |:---|:---|...）
    in_table && /^\|[-:| ]+\|$/ { next }
    # 处理数据行
    in_table && /^\|/ {
        gsub(/^\|/, "", $0)
        gsub(/\|$/, "", $0)
        n = split($0, fields, "\\|")
        if (n >= 4) {
            id = fields[2]
            gsub(/^[ \t]*`?/, "", id)
            gsub(/`?[ \t]*$/, "", id)
            if (id != "" && id != "-") {
                print id
            }
        }
    }
    # 遇到空行或非表格行，退出表格模式（可选增强）
    !/^\|/ && in_table { in_table = 0 }
    '
}

show_verbose() {
    local content
    if [[ "$DESC_FILE" == http* ]]; then
        content=$(curl -s --fail "$DESC_FILE")
    elif [[ -f "$DESC_FILE" ]]; then
        content=$(cat "$DESC_FILE")
    else
        content=$(curl -s --fail "${BASE_URL}${DESC_FILE}")
    fi

    echo
    echo "$content" | awk '
    BEGIN {
        in_table = 0
    }
    /^\|/ && $0 ~ /\| 名称 \| 扩展 ID \|/ {
        in_table = 1
        next
    }
    in_table && /^\|[-:| ]+\|$/ { next }
    in_table && /^\|/ {
        gsub(/^\|/, "", $0)
        gsub(/\|$/, "", $0)
        n = split($0, fields, "\\|")
        if (n >= 5) {
            name_raw = fields[1]
            id = fields[2]
            desc = fields[4]

            # 提取 **...** 中的名称
            if (match(name_raw, /\*\*([^*]+)\*\*/)) {
                name = substr(name_raw, RSTART+2, RLENGTH-4)
            } else {
                gsub(/[\[\]\*\`]/, "", name_raw)
                name = name_raw
            }

            gsub(/^[ \t]*`?/, "", id)
            gsub(/`?[ \t]*$/, "", id)
            gsub(/^[ \t]+|[ \t]+$/, "", desc)

            if (id != "" && id != "-") {
                printf "名称: %s\n扩展ID: %s\n描述: %s\n\n", name, id, desc
            }
        }
    }
    !/^\|/ && in_table { in_table = 0 }
    '
    echo
}

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

    if $VERBOSE; then
        show_verbose
        exit 0
    fi

    echo "正在从 $DESC_FILE 提取扩展列表..."
    EXTENSIONS=$(extract_extensions)

    if [ -z "$EXTENSIONS" ]; then
        echo "错误：未找到有效的扩展 ID 列表！" >&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"
    echo "-----------------"

    while IFS= read -r ext; do
        [ -z "$ext" ] && continue
        echo "安装: $ext"
        $BASE_CMD "$ext" $EXTRA || echo "警告: 安装 $ext 失败（可能已安装或 ID 无效）"
    done <<< "$EXTENSIONS"

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

main "$@"