#!/usr/bin/env bash

BASE_URL="https://gist.asfd.cn/jetsung/linux/raw/HEAD/"
LIST_FILE="apt.txt"              # 默认 apt 包列表文件
DESC_FILE="README.md"            # 描述 Markdown 文件
EXTRA=""
VERBOSE=false                    # -v: 只显示详细信息，不安装

# 参数解析
parameters() {
    while getopts "e:n:v" opt; do
        case $opt in
            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 没有扩展名，自动添加 .txt
    if [[ "$LIST_FILE" != *.* ]]; then
        LIST_FILE="${LIST_FILE}.txt"
    fi

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

    # -v 模式：解析 README.md 并显示软件详细信息
    if $VERBOSE; then
        echo "从 $URL_DESC 获取软件描述信息..."
        echo
        curl -s --fail "$URL_DESC" | awk '
        /^\|.*\|.*\|.*\|.*\|$/ && NR > 2 {  # 匹配数据行，跳过表头和分隔线
            gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "")  # 去除行首尾空白
            split($0, fields, "|")
            if (length(fields) < 5) next

            # 名称（第2列）
            name_raw = fields[2]
            gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", name_raw)
            # 支持 [text](url) 或 **text**
            if (match(name_raw, /\[([^]]+)\]/) || match(name_raw, /\*\*([^*]+)\*\*/)) {
                name = substr(name_raw, RSTART + (substr(name_raw, RSTART, 1) == "[" ? 1 : 2), 
                                      RLENGTH - (substr(name_raw, RSTART, 1) == "[" ? 2 : 4))
            } else {
                name = name_raw
            }

            # apt ID（第3列，可能有 ` 或空）
            apt_raw = fields[3]
            gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", apt_raw)
            gsub(/`/, "", apt_raw)  # 去除可能存在的反引号
            if (apt_raw == "") apt_raw = "(无)"

            # dnf ID（第4列，可能为空）
            dnf_raw = fields[4]
            gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", dnf_raw)
            gsub(/`/, "", dnf_raw)
            if (dnf_raw == "") dnf_raw = "(无)"

            # 描述（第5列）
            desc = fields[5]
            gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", desc)

            if (name == "" || desc == "") next

            printf "名称: %s\napt 包名: %s\n dnf 包名: %s\n描述: %s\n\n", name, apt_raw, dnf_raw, desc
        }'
        echo
        exit 0
    fi

    # 正常模式：下载包列表并使用 apt 安装
    URL_LIST="${BASE_URL}${LIST_FILE}"
    echo "从 $URL_LIST 下载软件列表..."
    SOFTS=$(curl -s --fail "$URL_LIST" | grep -v '^#' | grep -v '^$' | sed '/^$/d')

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

    # 将列表转为数组，避免管道子 shell 问题
    mapfile -t soft_array <<< "$SOFTS"

    BASE_CMD="sudo apt install -y"
    echo "开始使用 apt 安装软件（命令: $BASE_CMD ... $EXTRA）"
    echo "安装列表:"
    printf '%s\n' "${soft_array[@]}"
    echo "-----------------"

    for soft in "${soft_array[@]}"; do
        [ -z "$soft" ] && continue
        echo "安装: $soft"
        $BASE_CMD "$soft" $EXTRA || echo "警告: 安装 $soft 失败"
    done

    echo "-----------------"
    echo "所有软件安装完成！"
}

main "$@"