#!/bin/bash

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

# 日志函数
log() {
    local level=$1
    local msg=$2
    local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    case $level in
        INFO)    echo -e "[${BLUE}INFO${RESET}] ${timestamp} - $msg" ;;
        SUCCESS) echo -e "[${GREEN}SUCCESS${RESET}] ${timestamp} - $msg" ;;
        WARNING) echo -e "[${YELLOW}WARNING${RESET}] ${timestamp} - $msg" ;;
        ERROR)   echo -e "[${RED}ERROR${RESET}] ${timestamp} - $msg" ;;
    esac
}

# 检查是否有root权限
check_root() {
    log INFO "检查root权限..."
    if [ "$(id -u)" -ne 0 ]; then
        log ERROR "请使用root用户运行此脚本"
        exit 1
    fi
    log SUCCESS "当前用户具有root权限"
}

# 检查系统版本
check_system() {
    log INFO "检查系统版本..."
    if [ -f /etc/redhat-release ]; then
        local version=$(cat /etc/redhat-release)
        log SUCCESS "检测到系统: $version"
    else
        log WARNING "未检测到RedHat系列系统，此脚本主要针对CentOS/RHEL设计"
    fi
}

# 检查磁盘空间
check_disk_space() {
    log INFO "检查磁盘空间..."
    local free_space=$(df -h / | awk 'NR==2 {print $4}')
    local free_space_mb=$(df -m / | awk 'NR==2 {print $4}')
    
    if [ "$free_space_mb" -lt 2000 ]; then
        log WARNING "磁盘空间不足，可用空间: $free_space，建议至少2GB"
    else
        log SUCCESS "磁盘空间充足，可用空间: $free_space"
    fi
}

# 检查内存
check_memory() {
    log INFO "检查内存..."
    local total_mem=$(free -m | awk 'NR==2 {print $2}')
    local free_mem=$(free -m | awk 'NR==2 {print $4}')
    
    log INFO "总内存: ${total_mem}MB，可用内存: ${free_mem}MB"
    
    if [ "$free_mem" -lt 1000 ]; then
        log WARNING "可用内存低于1GB，可能影响安装性能"
    else
        log SUCCESS "内存充足"
    fi
}

# 检查 SELinux 状态
check_selinux() {
    log INFO "检查SELinux状态..."
    if command -v getenforce &>/dev/null; then
        local selinux_status=$(getenforce)
        log INFO "SELinux当前状态: $selinux_status"
        
        if [ "$selinux_status" = "Enforcing" ]; then
            log WARNING "SELinux处于强制模式，可能影响某些服务的正常运行"
            log INFO "您可以通过执行 'setenforce 0' 临时设置为宽容模式"
            log INFO "或编辑 /etc/selinux/config 文件将 SELINUX=enforcing 修改为 SELINUX=permissive 后重启以永久更改"
        fi
    else
        log INFO "未检测到SELinux工具"
    fi
}

# 检查OpenSSL版本并自动升级
check_openssl_version() {
    log INFO "检查OpenSSL版本..."
    
    # 定义目标最低版本
    local TARGET_VERSION="1.1.1"
    
    # 获取当前版本（去除可能的后缀）
    if command -v openssl &>/dev/null; then
        local current_version=$(openssl version | awk '{print $2}' | cut -d '-' -f1 | cut -d '+' -f1)
        log INFO "当前OpenSSL版本: $current_version"
        
        # 版本比较
        if printf '%s\n' "$current_version" "$TARGET_VERSION" | sort -V | head -n1 | grep -q "^$current_version$"; then
            if [ "$current_version" != "$TARGET_VERSION" ]; then
                log WARNING "OpenSSL版本 ($current_version) 低于推荐版本 ($TARGET_VERSION)，尝试自动升级..."
                
                # 查找升级脚本
                if [ -f "0_upgrade_openssl_1.1.1.sh" ]; then
                    log INFO "执行OpenSSL升级脚本..."
                    chmod +x 0_upgrade_openssl_1.1.1.sh
                    ./0_upgrade_openssl_1.1.1.sh
                    
                    # 检查升级结果
                    local new_version=$(openssl version | awk '{print $2}' | cut -d '-' -f1 | cut -d '+' -f1)
                    if printf '%s\n' "$new_version" "$TARGET_VERSION" | sort -V | head -n1 | grep -q "^$TARGET_VERSION$"; then
                        log SUCCESS "OpenSSL已成功升级到: $new_version"
                        return 0
                    else
                        log ERROR "OpenSSL升级失败，当前版本: $new_version"
                        return 1
                    fi
                else
                    log ERROR "OpenSSL版本过低，且未找到升级脚本(0_upgrade_openssl_1.1.1.sh)"
                    return 1
                fi
            fi
        fi
        log SUCCESS "OpenSSL版本符合要求"
    else
        log ERROR "未检测到OpenSSL，请先安装"
        yum install -y openssl
        if [ $? -ne 0 ]; then
            return 1
        fi
        log SUCCESS "已安装OpenSSL"
    fi
    return 0
}

# 检查防火墙80端口状态并自动配置
check_firewall_port80() {
    log INFO "检查防火墙80端口状态..."
    
    # 检查firewalld是否安装并运行
    if ! command -v firewall-cmd &>/dev/null; then
        log WARNING "未安装firewalld，正在安装..."
        yum install -y firewalld
        if [ $? -ne 0 ]; then
            log ERROR "安装firewalld失败"
            return 1
        fi
    fi
    
    if ! systemctl is-active firewalld &>/dev/null; then
        log WARNING "防火墙服务(firewalld)未运行，正在启动..."
        systemctl start firewalld
        if [ $? -ne 0 ]; then
            log ERROR "启动firewalld失败"
            return 1
        fi
        systemctl enable firewalld
        log SUCCESS "防火墙服务已启动并设置为开机自启"
    else
        log INFO "防火墙服务(firewalld)正在运行"
    fi
    
    # 检查80端口是否开放
    if firewall-cmd --query-port=80/tcp &>/dev/null; then
        log SUCCESS "80端口(TCP)已在防火墙中开放"
    else
        log WARNING "80端口(TCP)未在防火墙中开放，尝试自动配置..."
        
        # 查找端口配置脚本
        if [ -f "0_allow_port80.sh" ]; then
            log INFO "执行防火墙端口配置脚本..."
            chmod +x 0_allow_port80.sh
            ./0_allow_port80.sh
            
            # 检查配置结果
            if firewall-cmd --query-port=80/tcp &>/dev/null; then
                log SUCCESS "80端口(TCP)已成功开放"
                return 0
            else
                log ERROR "80端口配置失败"
                return 1
            fi
        else
            log WARNING "未找到端口配置脚本(0_allow_port80.sh)，尝试手动配置..."
            firewall-cmd --permanent --add-port=80/tcp
            firewall-cmd --reload
            
            # 检查配置结果
            if firewall-cmd --query-port=80/tcp &>/dev/null; then
                log SUCCESS "80端口(TCP)已成功开放"
                return 0
            else
                log ERROR "80端口配置失败"
                return 1
            fi
        fi
    fi
    
    return 0
}

# 检查网络连接
check_network() {
    log INFO "检查网络连接..."
    
    # 测试主要的下载源连接性
    if ping -c 2 mirrors.aliyun.com &>/dev/null; then
        log SUCCESS "可以连接到阿里云镜像站"
    else
        log WARNING "无法连接到阿里云镜像站，可能影响安装速度"
    fi
    
    # 检查yum源状态
    if yum check-update --quiet &>/dev/null; then
        log SUCCESS "YUM源连接正常"
    else
        log WARNING "YUM源连接异常，请检查网络或YUM配置"
    fi
}

# 总结检查结果
summarize_checks() {
    echo ""
    log INFO "========== 前置检查完成 =========="
    
    if [ $openssl_check -eq 0 ] && [ $firewall_check -eq 0 ]; then
        log SUCCESS "所有检查通过，系统符合安装要求"
        exit_code=0
    else
        log ERROR "预检查修复失败，请手动解决问题后重新运行"
        exit_code=1
    fi
    
    return $exit_code
}

# 主流程
main() {
    echo ""
    log INFO "========== 开始系统前置检查 =========="
    echo ""
    
    # 基础系统检查
    check_root
    check_system
    check_disk_space
    check_memory
    check_selinux
    check_network
    
    # 专用项目检查（记录状态）- 这些函数现在会尝试自动修复问题
    check_openssl_version
    openssl_check=$?
    
    check_firewall_port80
    firewall_check=$?
    
    # 总结结果
    summarize_checks
    return $?
}

# 执行主函数
main
exit $?