#!/usr/bin/env bash
# 设置严格模式
set -Eeuo pipefail

# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color

# 输出带颜色的消息
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否以 root 用户身份执行脚本
check_root() {
    if [ "$EUID" -ne 0 ]; then
        log_error "此脚本需要以 root 权限执行。请使用 sudo 重新运行此脚本。"
        exit 1
    fi
}

# 检查系统是否为 Debian/Ubuntu
check_system() {
    if [ ! -f /etc/os-release ]; then
        log_error "无法确定系统类型，此脚本仅适用于 Debian/Ubuntu 系统。"
        exit 1
    fi
    
    source /etc/os-release
    if [[ ! "$ID" =~ ^(debian|ubuntu)$ ]]; then
        log_error "此脚本仅适用于 Debian/Ubuntu 系统，当前系统为 $ID。"
        exit 1
    fi
    
    if [ -z "$VERSION_ID" ]; then
        log_error "无法确定系统版本。"
        exit 1
    fi
}

# 安装必要的软件包
install_packages() {
    log_info "正在安装必要的软件包..."
    apt update -y && apt install -y gnupg2 wget || { 
        log_error "安装必要软件包失败。"; 
        exit 1; 
    }
    log_info "必要的软件包安装完成。"
}

# 添加 GPG 密钥
add_gpg_key() {
    log_info "正在添加 GPG 密钥..."
    local version_id
    source /etc/os-release
    version_id=$VERSION_ID

    local key_url="http://downloadcontent.opensuse.org/repositories/home:/alvistack/Debian_${version_id}/Release.key"
    wget -qO- "$key_url" | gpg --dearmor | tee /etc/apt/trusted.gpg.d/alvistack.gpg >/dev/null || { 
        log_error "添加 GPG 密钥失败"; 
        exit 1; 
    }
    log_info "GPG 密钥添加完成。"
}

# 添加 APT 仓库
add_apt_repo() {
    log_info "正在添加 APT 仓库..."
    local version_id
    source /etc/os-release
    version_id=$VERSION_ID

    echo "deb http://downloadcontent.opensuse.org/repositories/home:/alvistack/Debian_${version_id}/ /" | tee /etc/apt/sources.list.d/alvistack.list >/dev/null
    apt update -y || { 
        log_error "添加 APT 仓库失败"; 
        exit 1; 
    }
    log_info "APT 仓库添加完成。"
}

# 安装 Podman
install_podman() {
    log_info "正在安装 Podman..."
    apt -y install podman uidmap dbus-x11 slirp4netns libpam-systemd podman-aardvark-dns podman-netavark || { 
        log_error "安装 Podman 失败"; 
        exit 1; 
    }
    log_info "Podman 安装完成。"
}

# 更新 Podman 网络配置
update_podman_network() {
    log_info "正在更新 Podman 网络配置..."
    podman network update podman || {
        log_warn "更新 Podman 网络失败，尝试继续执行。"
    }
    
    if [ -f /etc/containers/networks/podman.json ]; then
        sed -i 's/"dns_enabled": false/"dns_enabled": true/' /etc/containers/networks/podman.json || {
            log_warn "修改 Podman 网络配置失败，尝试继续执行。"
        }
        
        podman network update podman || {
            log_warn "再次更新 Podman 网络失败，尝试继续执行。"
        }
        log_info "Podman 网络配置更新完成。"
    else
        log_warn "Podman 网络配置文件不存在，跳过网络配置更新。"
    fi
}

# 安装 podman-compose
install_podman_compose() {
    log_info "正在安装 podman-compose..."
    local compose_url="https://github.com/containers/podman-compose/archive/devel.tar.gz"
    
    # 检查是否存在 uv
    if command -v uv &> /dev/null; then
        log_info "检测到 uv，使用 uv 安装 podman-compose..."
        uv tool install "$compose_url" || {
            log_error "使用 uv 安装 podman-compose 失败"
            exit 1
        }
    # 检查是否存在 python3 和 pip3
    elif command -v python3 &> /dev/null && command -v pip3 &> /dev/null; then
        log_info "检测到 python3 和 pip3，使用 pip3 安装 podman-compose..."
        pip3 install "$compose_url" || {
            log_error "使用 pip3 安装 podman-compose 失败"
            exit 1
        }
    # 如果都不存在，提示用户手动安装
    else
        log_error "未检测到 uv、python3 或 pip3。请手动安装 Python 或 uv，然后使用以下命令安装 podman-compose:"
        echo "  使用 pip: pip install $compose_url"
        echo "  或使用 uv: uv tool install $compose_url"
        exit 1
    fi
    
    # 检查安装结果
    if ! command -v podman-compose &> /dev/null; then
        log_warn "podman-compose 已安装，但可能不在 PATH 中。"
        log_info "如果你使用 pip 安装，podman-compose 可能在 ~/.local/bin 或 /usr/local/bin 中。"
    else
        log_info "podman-compose 安装完成，可以通过 'podman-compose' 命令使用。"
    fi
}

# 添加别名到 .bashrc
add_aliases() {
    log_info "正在添加命令别名..."
    
    # 获取实际用户（非 root）的用户名和主目录
    local real_user=""
    local user_home=""
    
    # 修复：安全地检查 SUDO_USER 变量是否存在
    if [ -n "${SUDO_USER:-}" ]; then
        # 通过 sudo 运行
        real_user="$SUDO_USER"
        user_home=$(eval echo ~"$SUDO_USER")
    elif [ "$USER" != "root" ]; then
        # 直接以非 root 用户运行
        real_user="$USER"
        user_home="$HOME"
    else
        # 直接以 root 用户运行，尝试获取首个普通用户
        real_user=$(grep -E '^[^:]+:[^:]+:1000:' /etc/passwd | cut -d: -f1)
        if [ -z "$real_user" ]; then
            log_warn "无法确定普通用户，将别名添加到 root 的 .bashrc。"
            real_user="root"
            user_home="/root"
        else
            user_home=$(eval echo ~"$real_user")
            log_info "找到普通用户: $real_user，将别名添加到其 .bashrc。"
        fi
    fi
    
    local bashrc="$user_home/.bashrc"
    
    if [ ! -f "$bashrc" ]; then
        log_warn "未找到 $bashrc 文件，创建新的文件。"
        touch "$bashrc"
        if [ "$real_user" != "root" ]; then
            chown "$real_user":"$real_user" "$bashrc"
        fi
    fi
    
    # 检查别名是否已存在，不存在则添加
    if ! grep -q "alias pc='podman-compose'" "$bashrc"; then
        echo "" >> "$bashrc"
        echo "# Podman 别名 - 由安装脚本添加" >> "$bashrc"
        echo "alias pc='podman-compose'" >> "$bashrc"
        echo "alias p='podman'" >> "$bashrc"
        log_info "别名已添加到 $bashrc。"
    else
        log_info "别名已存在，跳过添加。"
    fi
    
    # 确保文件权限正确
    if [ "$real_user" != "root" ]; then
        chown "$real_user":"$real_user" "$bashrc"
    fi
}

# 执行脚本流程
main() {
    log_info "开始安装 Podman 和 podman-compose..."
    
    check_root       # 检查 root 权限
    check_system     # 检查系统类型
    install_packages # 安装必要软件包
    add_gpg_key      # 添加 GPG 密钥
    add_apt_repo     # 添加 APT 仓库并更新
    install_podman   # 安装 Podman
    update_podman_network # 更新 Podman 网络配置
    install_podman_compose # 安装 podman-compose
    add_aliases      # 添加别名
    
    log_info "安装完成！请退出终端重新连接以使别名生效。"
    log_info "你可以使用 'p' 代替 'podman'，使用 'pc' 代替 'podman-compose'。"
}

# 执行主函数
main

