#!/bin/bash

# ==============================================================================
# 风七六平台 - 阿里云服务器状态检查与清理脚本
# 符合大厂标准的服务器运维工具
# ==============================================================================

set -e

# 配置常量
WORK_DIR="/opt/Fzxpodman"
BACKUP_DIR="$WORK_DIR/backup"
LOG_DIR="$WORK_DIR/infrastructure/logs"
COMPOSE_FILE="$WORK_DIR/infrastructure/compose/podman-compose.aliyun-dev.yml"

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

# 输出函数
print_color() {
    local color=$1
    local message=$2
    echo -e "${color}${message}${NC}"
}

print_section() {
    echo ""
    print_color "$CYAN" "========================================"
    print_color "$CYAN" "$1"
    print_color "$CYAN" "========================================"
}

# 检查服务器状态
check_server_status() {
    print_section "1. 服务器基础状态检查"
    
    print_color "$YELLOW" "CPU 使用率:"
    top -bn1 | head -5
    
    print_color "$YELLOW" "\n内存使用:"
    free -h
    
    print_color "$YELLOW" "\n磁盘空间:"
    df -h
    
    print_color "$YELLOW" "\n网络连接:"
    ss -tuln | head -20
}

# 检查工作目录结构
check_work_directory() {
    print_section "2. 工作目录结构检查"
    
    print_color "$YELLOW" "工作目录内容:"
    ls -la "$WORK_DIR"
    
    print_color "$YELLOW" "\n服务目录结构:"
    ls -la "$WORK_DIR/services/" | head -15
    
    print_color "$YELLOW" "\n基础设施目录:"
    ls -la "$WORK_DIR/infrastructure/"
}

# 检查容器状态
check_containers() {
    print_section "3. 容器运行状态检查"
    
    print_color "$YELLOW" "运行中的容器:"
    podman ps
    
    print_color "$YELLOW" "\n所有容器(包括已停止):"
    podman ps -a
    
    print_color "$YELLOW" "\n容器资源使用:"
    podman stats --no-stream
}

# 检查镜像状态
check_images() {
    print_section "4. 镜像状态检查"
    
    print_color "$YELLOW" "本地镜像列表:"
    podman images
    
    print_color "$YELLOW" "\n悬空镜像(未被使用的镜像):"
    dangling=$(podman images -f "dangling=true" -q)
    if [ -n "$dangling" ]; then
        podman images -f "dangling=true"
    else
        print_color "$GREEN" "无悬空镜像"
    fi
}

# 检查网络配置
check_network() {
    print_section "5. 网络配置检查"
    
    print_color "$YELLOW" "自定义网络状态:"
    podman network ls
    
    print_color "$YELLOW" "\nfzx-aliyun-dev-network 详情:"
    podman network inspect fzx-aliyun-dev-network 2>/dev/null || print_color "$RED" "网络不存在"
}

# 检查日志文件
check_logs() {
    print_section "6. 日志文件检查"
    
    print_color "$YELLOW" "日志目录内容:"
    ls -la "$LOG_DIR" 2>/dev/null || print_color "$RED" "日志目录不存在"
    
    if [ -d "$LOG_DIR" ]; then
        print_color "$YELLOW" "\n日志文件大小:"
        du -sh "$LOG_DIR"/* 2>/dev/null | head -20
    fi
}

# 清理悬空镜像
cleanup_dangling_images() {
    print_section "7. 清理悬空镜像"
    
    dangling=$(podman images -f "dangling=true" -q)
    if [ -n "$dangling" ]; then
        print_color "$YELLOW" "正在删除悬空镜像..."
        podman rmi -f $dangling
        print_color "$GREEN" "悬空镜像清理完成"
    else
        print_color "$GREEN" "无悬空镜像需要清理"
    fi
}

# 清理旧日志
cleanup_old_logs() {
    print_section "8. 清理旧日志文件"
    
    if [ -d "$LOG_DIR" ]; then
        print_color "$YELLOW" "查找超过7天的日志文件..."
        old_logs=$(find "$LOG_DIR" -name "*.log" -type f -mtime +7)
        if [ -n "$old_logs" ]; then
            echo "$old_logs"
            print_color "$YELLOW" "\n正在删除旧日志..."
            find "$LOG_DIR" -name "*.log" -type f -mtime +7 -delete
            print_color "$GREEN" "旧日志清理完成"
        else
            print_color "$GREEN" "无超过7天的日志文件"
        fi
    else
        print_color "$YELLOW" "日志目录不存在，跳过"
    fi
}

# 清理未使用的容器
cleanup_stopped_containers() {
    print_section "9. 清理已停止的容器"
    
    stopped=$(podman ps -a -f "status=exited" -q)
    if [ -n "$stopped" ]; then
        print_color "$YELLOW" "已停止的容器列表:"
        podman ps -a -f "status=exited"
        
        print_color "$YELLOW" "\n正在删除已停止的容器..."
        podman rm $stopped
        print_color "$GREEN" "已停止容器清理完成"
    else
        print_color "$GREEN" "无已停止的容器需要清理"
    fi
}

# 清理未使用的卷
cleanup_unused_volumes() {
    print_section "10. 清理未使用的卷"
    
    unused=$(podman volume ls -q)
    if [ -n "$unused" ]; then
        print_color "$YELLOW" "检查未使用的卷..."
        podman volume prune -f
        print_color "$GREEN" "未使用卷清理完成"
    else
        print_color "$GREEN" "无卷需要清理"
    fi
}

# 备份配置文件
backup_configs() {
    print_section "11. 备份关键配置文件"
    
    mkdir -p "$BACKUP_DIR"
    
    BACKUP_TIME=$(date +%Y%m%d%H%M%S)
    
    print_color "$YELLOW" "备份时间: $BACKUP_TIME"
    
    # 备份compose文件
    if [ -f "$COMPOSE_FILE" ]; then
        cp "$COMPOSE_FILE" "$BACKUP_DIR/podman-compose.aliyun-dev.yml.backup.$BACKUP_TIME"
        print_color "$GREEN" "✓ Compose文件已备份"
    fi
    
    # 备份环境变量文件
    ENV_FILE="$WORK_DIR/infrastructure/compose/.env.aliyun"
    if [ -f "$ENV_FILE" ]; then
        cp "$ENV_FILE" "$BACKUP_DIR/.env.aliyun.backup.$BACKUP_TIME"
        print_color "$GREEN" "✓ 环境变量文件已备份"
    fi
    
    # 备份Nginx配置
    NGINX_CONF="$WORK_DIR/infrastructure/nginx/conf/aliyun-dev.conf"
    if [ -f "$NGINX_CONF" ]; then
        cp "$NGINX_CONF" "$BACKUP_DIR/aliyun-dev.conf.backup.$BACKUP_TIME"
        print_color "$GREEN" "✓ Nginx配置已备份"
    fi
    
    # 记录当前部署状态
    podman ps --format "{{.Names}}: {{.Image}}" > "$BACKUP_DIR/current-deployment-$BACKUP_TIME.txt"
    print_color "$GREEN" "✓ 当前部署状态已记录"
    
    print_color "$GREEN" "\n备份完成，备份目录: $BACKUP_DIR"
}

# 显示清理摘要
show_summary() {
    print_section "12. 清理完成摘要"
    
    print_color "$YELLOW" "当前运行中容器数量:"
    podman ps | wc -l | awk '{print $1-1 " 个"}'
    
    print_color "$YELLOW" "\n当前镜像数量:"
    podman images | wc -l | awk '{print $1-1 " 个"}'
    
    print_color "$YELLOW" "\n磁盘使用情况:"
    df -h "$WORK_DIR"
    
    print_color "$GREEN" "\n✅ 服务器状态检查与清理完成!"
}

# 主执行函数
main() {
    print_color "$CYAN" "========================================"
    print_color "$CYAN" "    风七六平台 - 服务器状态检查与清理"
    print_color "$CYAN" "========================================"
    print_color "$YELLOW" "日期: $(date)"
    print_color "$YELLOW" "工作目录: $WORK_DIR"
    
    # 执行检查
    check_server_status
    check_work_directory
    check_containers
    check_images
    check_network
    check_logs
    
    # 执行清理
    cleanup_dangling_images
    cleanup_old_logs
    cleanup_stopped_containers
    cleanup_unused_volumes
    
    # 备份配置
    backup_configs
    
    # 显示摘要
    show_summary
    
    print_color "$CYAN" "\n========================================"
    print_color "$CYAN" "           下一步部署建议"
    print_color "$CYAN" "========================================"
    print_color "$YELLOW" "1. 从本地推送最新镜像到私有仓库"
    print_color "$YELLOW" "2. 在服务器上拉取最新镜像"
    print_color "$YELLOW" "3. 停止旧服务并启动新服务"
    print_color "$YELLOW" "4. 验证服务状态"
    print_color "$CYAN" "========================================"
}

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case "$1" in
        -c|--clean)
            CLEAN_ONLY=true
            shift
            ;;
        -b|--backup)
            BACKUP_ONLY=true
            shift
            ;;
        -h|--help)
            echo "使用方法: $0 [选项]"
            echo "选项:"
            echo "  -c, --clean    仅执行清理操作"
            echo "  -b, --backup   仅执行备份操作"
            echo "  -h, --help     显示帮助信息"
            exit 0
            ;;
        *)
            shift
            ;;
    esac
done

# 执行主函数
main