#!/bin/bash

# 定义颜色代码
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033[34m'
RESET='\033[0m'

# 日志输出函数
log() {
    local level=$1
    local msg=$2
    case $level in
        INFO)    echo -e "${BLUE}[INFO]${RESET} $msg" ;;
        SUCCESS) echo -e "${GREEN}[SUCCESS]${RESET} $msg" ;;
        ERROR)   echo -e "${RED}[ERROR]${RESET} $msg" ;;
        WARNING) echo -e "${YELLOW}[WARNING]${RESET} $msg" ;;
    esac
}

# 检查并安装必备工具（前置命令）
install_prerequisites() {
    log INFO "检查并安装必备工具..."
    local required_tools=("wget" "curl" "rpm" "yum" "expect" "sudo" "grep" "awk" "sed" "systemctl")
    
    for tool in "${required_tools[@]}"; do
        if ! command -v "$tool" &> /dev/null; then
            log WARNING "$tool 未安装，正在安装..."
            if sudo yum install -y "$tool"; then
                log INFO "$tool 安装成功"
            else
                log ERROR "$tool 安装失败，脚本终止"
                exit 1
            fi
        else
            log INFO "$tool 已安装"
        fi
    done
}

# 检查并卸载旧版本 MySQL/MariaDB
remove_old_versions() {
    log INFO "检查旧版本 MySQL/MariaDB..."
    local old_packages=$(rpm -qa | grep -E 'mysql|mariadb')
    if [ -n "$old_packages" ]; then
        log WARNING "发现旧版本，正在卸载..."
        if sudo yum remove -y mysql-* mariadb-* > /dev/null 2>&1; then
            log INFO "旧版本已卸载"
            sudo rm -rf /var/lib/mysql /etc/my.cnf  # 删除残留数据和配置
            log INFO "残留文件已清除"
        else
            log ERROR "旧版本卸载失败，请手动处理"
            exit 1
        fi
    else
        log INFO "未发现旧版本"
    fi
}

# 安装 MySQL Yum 仓库配置（多镜像源 + 下载校验）
install_repo() {
    local repo_urls=(
#        "http://dw.chan.ink/组件源码/mysql-community-server-8.0.42-1.el7.x86_64.rpm" #chan.ink自己的网站
        "https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm"  # 官方源
        "https://repo.mysql.com//mysql80-community-release-el7-7.noarch.rpm"   # 备用官方源
        "https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql80-community-release-el7-7.noarch.rpm"  # 阿里云镜像
    )
    local repo_rpm="mysql80-community-release-el7-7.noarch.rpm"

    # 循环尝试下载，直到成功
    for url in "${repo_urls[@]}"; do
        log INFO "尝试从 $url 下载仓库配置..."
        if curl -sS -o "$repo_rpm" "$url"; then
            # 检查文件是否有效（大小 > 0）
            if [ -s "$repo_rpm" ]; then
                log SUCCESS "仓库配置下载成功"
                break
            else
                log WARNING "下载的文件为空，尝试下一个链接..."
                rm -f "$repo_rpm"  # 删除空文件
            fi
        else
            log WARNING "下载失败，尝试下一个链接..."
        fi
    done

    if [ ! -s "$repo_rpm" ]; then
        log ERROR "所有镜像源下载失败，请手动下载后重试"
        exit 1
    fi

    log INFO "安装仓库配置（需要管理员权限）..."
    if ! sudo rpm -ivh "$repo_rpm"; then
        log ERROR "仓库配置安装失败，可能权限不足，请使用 sudo 运行脚本"
        exit 1
    fi

    # 强制启用 MySQL 8.0 仓库
    log INFO "启用 MySQL 8.0 仓库..."
    sudo sed -i '/\[mysql80-community\]/,/^\[/ { s/enabled=0/enabled=1/ }' /etc/yum.repos.d/mysql-community.repo
    log SUCCESS "仓库配置启用成功"
}

# 安装 MySQL 8.0 服务器
install_mysql_server() {
    log INFO "检查仓库中是否存在 mysql-community-server..."
    if ! yum list mysql-community-server &> /dev/null; then
        log ERROR "仓库中无 mysql-community-server 的包，请检查仓库配置"
        exit 1
    fi

    log INFO "导入 GPG 密钥..."
    if ! sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 > /dev/null 2>&1; then
        log WARNING "GPG 密钥导入失败，将跳过检查继续安装"
    fi

    log INFO "开始安装 MySQL 服务..."
    if ! sudo yum install -y mysql-community-server; then
        log WARNING "常规安装失败，尝试禁用 GPG 检查..."
        if ! sudo yum install -y mysql-community-server --nogpgcheck; then
            log ERROR "MySQL 安装失败，请手动排查"
            exit 1
        fi
    fi
    log SUCCESS "MySQL 服务安装完成"
}

# 初始化服务并设置安全密码
secure_mysql() {
    log INFO "启动并初始化 MySQL 服务..."
    sudo systemctl enable --now mysqld > /dev/null 2>&1
    log INFO "服务已启动并设置开机自启"

    # 等待服务启动（最多 30 秒）
    local timeout=30
    while [ $timeout -gt 0 ]; do
        if systemctl is-active mysqld > /dev/null; then
            break
        fi
        sleep 1
        ((timeout--))
    done
    [ $timeout -eq 0 ] && log WARNING "服务启动超时，可能影响后续操作"

    # 获取初始密码（增强鲁棒性）
    log INFO "获取初始临时密码..."
    local temp_pass=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}' | tail -1)
    if [ -z "$temp_pass" ]; then
        log ERROR "无法获取初始密码，请检查日志：/var/log/mysqld.log"
        exit 1
    fi
    log INFO "初始密码（有效期 24 小时）：$temp_pass"

    # 设置固定新密码（可自定义为更复杂的密码）
    local new_pass="Chan1996!"  # 需符合 MySQL 密码策略（默认至少 8 位，含大小写、数字、符号）
    
    # 自动化密码修改
    log INFO "开始修改密码..."
    /usr/bin/expect <<EOF > /dev/null 2>&1
set timeout 20
spawn mysql -u root -p --connect-expired-password
expect "Enter password:"
send "$temp_pass\r"
expect "mysql>"
send "ALTER USER 'root'@'localhost' IDENTIFIED BY '$new_pass';\r"
expect "mysql>"
send "FLUSH PRIVILEGES;\r"
expect "mysql>"
send "exit\r"
expect eof
EOF

    # 验证新密码
    if mysql -u root -p"$new_pass" -e "SELECT 1;" > /dev/null 2>&1; then
        log SUCCESS "密码修改成功！新密码：$new_pass"
        # 保存密码到环境变量（避免重复写入）
        sed -i '/export MYSQL_ROOT_PASS=/d' ~/.bashrc
        echo "export MYSQL_ROOT_PASS='$new_pass'" >> ~/.bashrc
        source ~/.bashrc
    else
        log ERROR "密码修改失败，请手动执行："
        echo "1. mysql -u root -p'$temp_pass' --connect-expired-password"
        echo "2. ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';"
        exit 1
    fi
}

# 清理临时文件
cleanup() {
    log INFO "清理临时文件..."
    sudo rm -f mysql80-community-release-el7-7.noarch.rpm > /dev/null 2>&1
    log SUCCESS "临时文件已清除"
}

# 主函数
main() {
    install_prerequisites
    remove_old_versions
    install_repo
    install_mysql_server
    secure_mysql
    cleanup

    echo -e "\n${GREEN}=== MySQL 8 安装完成 ===${RESET}"
    echo -e "• 密码已保存到环境变量：${YELLOW}MYSQL_ROOT_PASS${RESET}"
    echo -e "• 查看密码：${BLUE}echo \$MYSQL_ROOT_PASS${RESET}"
    echo -e "• 登录命令：${GREEN}mysql -u root -p\$MYSQL_ROOT_PASS${RESET}"
    echo -e "• 服务管理：${BLUE}systemctl [start|stop|restart] mysqld${RESET}"
}

# 执行主函数
main