#!/bin/bash
set -euo pipefail

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

# 检查SSH配置
check_ssh_setup() {
    echo -e "${YELLOW}正在检查SSH配置...${NC}"
    
    # 检查是否已有SSH密钥
    if [[ ! -f ~/.ssh/id_rsa ]]; then
        echo -e "${RED}未检测到SSH密钥${NC}"
        read -p "是否要生成新的SSH密钥对？[y/n]: " generate_key
        if [[ "$generate_key" == [yY] ]]; then
            ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
            echo -e "${GREEN}SSH密钥已生成${NC}"
        else
            echo -e "${RED}必须设置SSH密钥才能继续${NC}"
            exit 1
        fi
    fi

    # 检查公钥是否已复制到服务器
    if ! ssh -o BatchMode=yes -o ConnectTimeout=5 "$REMOTE_SERVER" true 2>/dev/null; then
        echo -e "${YELLOW}需要设置SSH免密登录${NC}"
        read -p "是否要将公钥复制到 $REMOTE_SERVER？[y/n]: " copy_key
        if [[ "$copy_key" == [yY] ]]; then
            ssh-copy-id -f "$REMOTE_SERVER"
            if ! ssh -o BatchMode=yes "$REMOTE_SERVER" true; then
                echo -e "${RED}SSH免密登录设置失败${NC}"
                exit 1
            fi
            echo -e "${GREEN}SSH免密登录已设置${NC}"
        else
            echo -e "${RED}必须设置SSH免密登录才能继续${NC}"
            exit 1
        fi
    fi
}

# 显示帮助信息
usage() {
    echo -e "${GREEN}用法:${NC}"
    echo "  $0 <远程服务器> <基础路径> <操作系统> <OS版本> <架构> [发布版本]"
    echo
    echo -e "${GREEN}示例:${NC}"
    echo "  $0 root@1.94.193.239 /var/www/html/yumrepo/agiros openeuler2403lts 2506 riscv64 release"
    echo "  $0 root@1.94.193.239 /var/www/html/yumrepo/agiros openeuler2403lts 2506 riscv64 dailybuild"
    echo "  $0 root@1.94.193.239 /var/www/html/yumrepo/agiros openeuler2403lts 2506 riscv64 3-party"
    exit 1
}

# 检查必需参数
if [[ $# -lt 5 ]]; then
    echo -e "${RED}错误: 参数不足${NC}" >&2
    usage
fi

REMOTE_SERVER=$1
BASE_PATH=$2
OS_NAME=$3
OS_VERSION=$4
ARCH=$5
RELEASE_VERSION=${6:-$(date +%Y%m%d)}

# 检查SSH配置
check_ssh_setup

# 确定发布目录 - 特殊处理release和dailybuild
if [[ "$RELEASE_VERSION" == "release" || "$RELEASE_VERSION" == "dailybuild" || "$RELEASE_VERSION" == "3-party" ]]; then
    RELEASE_DIR="$RELEASE_VERSION"
else
    RELEASE_DIR="v${RELEASE_VERSION}"
fi

# 构建完整路径
FULL_PATH="${BASE_PATH}/${OS_NAME}/${OS_VERSION}/${ARCH}/${RELEASE_DIR}"

# 调试信息
echo -e "${YELLOW}调试信息:${NC}"
echo "远程服务器: $REMOTE_SERVER"
echo "基础路径: $BASE_PATH"
echo "操作系统: $OS_NAME"
echo "OS版本: $OS_VERSION"
echo "架构: $ARCH"
echo "发布版本: $RELEASE_VERSION"
echo "发布目录: $RELEASE_DIR"
echo "完整路径: $FULL_PATH"
echo

# 检查createrepo命令
echo -e "${YELLOW}检查远程服务器上的createrepo工具...${NC}"
CREATEREPO_CMD=$(ssh "$REMOTE_SERVER" "command -v createrepo_c || command -v createrepo" || {
    echo -e "${RED}错误: 远程服务器上未找到createrepo或createrepo_c${NC}" >&2
    exit 1
})
echo -e "${GREEN}找到createrepo工具: $CREATEREPO_CMD${NC}"

# 准备重建日志
REBUILD_LOG=$(cat <<EOL
### 重建日志 - $(date "+%Y-%m-%d %H:%M:%S")

**操作类型**: 强制重建仓库
**执行用户**: $(whoami)@$(hostname)
**RPM包数量**: $(ssh "$REMOTE_SERVER" "find '$FULL_PATH' -name '*.rpm' 2>/dev/null | wc -l" | tr -d ' ')
**createrepo版本**: $(ssh "$REMOTE_SERVER" "$CREATEREPO_CMD --version")

EOL
)

# 强制重建仓库
echo -e "${YELLOW}正在强制重建仓库...${NC}"
ssh "$REMOTE_SERVER" "
    # 创建目录结构
    mkdir -p '$FULL_PATH' || {
        echo '创建目录失败' >&2
        exit 1
    }
    
    # 清理旧仓库数据
    rm -rf '$FULL_PATH'/repodata 2>/dev/null
    
    # 检查目录是否为空
    if [ -z \"\$(ls -A '$FULL_PATH')\" ]; then
        echo -e '${YELLOW}警告: 仓库目录为空，请确保添加RPM包${NC}' >&2
    fi
    
    # 重建仓库
    cd '$FULL_PATH' && $CREATEREPO_CMD .
" || {
    echo -e "${RED}仓库重建失败${NC}" >&2
    exit 1
}

# 更新README文件
echo -e "${YELLOW}更新README文件...${NC}"
ssh "$REMOTE_SERVER" "
    # 如果README不存在，创建并添加标题
    if [ ! -f '${FULL_PATH}/README.md' ]; then
        cat > '${FULL_PATH}/README.md' <<EOF
# ${OS_NAME} ${OS_VERSION} ${ARCH} ${RELEASE_DIR} 仓库

## 仓库信息
- 操作系统: ${OS_NAME}
- OS版本: ${OS_VERSION}
- 架构: ${ARCH}
- 发布版本: ${RELEASE_DIR}
- 仓库类型: RPM/YUM
- 创建时间: $(date "+%Y-%m-%d %H:%M:%S")

## 重建历史
EOF
    fi
    
    # 追加重建日志
    cat >> '${FULL_PATH}/README.md' <<EOF
${REBUILD_LOG}
EOF
"

echo -e "${GREEN}仓库重建成功!${NC}"
echo -e "访问路径: ${YELLOW}${FULL_PATH}${NC}"
echo -e "重建日志已追加到: ${BLUE}${FULL_PATH}/README.md${NC}"
