#!/usr/bin/env bash

# ==========================================
# 脚本名称: 0_基础配置.sh
# 功能: 1. 审计日志 (路径修正为 ./log/wgr_audit.log) 2. 时区设置 3. 静态 IP
# ==========================================

# --- 基础变量定义 ---
# 获取 WGR 根目录 (因为脚本在 ./js 下，所以 dirname 两次)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BASE_DIR="$(dirname "$SCRIPT_DIR")"

LOG_DIR="${BASE_DIR}/log"
# 【核心修改】日志文件路径指向 wgr.sh 同级目录下的 log 文件夹
AUDIT_LOG="${LOG_DIR}/wgr_audit.log"
BASHRC_FILE="/etc/bash.bashrc"
BASHRC_BACKUP="${BASHRC_FILE}.wgr_backup_$(date +%s)"

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

# --- 辅助函数 ---
log_msg() {
    local level=$1
    local msg=$2
    echo -e "${level} $msg"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $msg" >> "$LOG_DIR/wgr.log"
}

# --- 回滚函数 ---
rollback() {
    local exit_code=$?
    if [ $exit_code -ne 0 ]; then
        log_msg "${RED}[ROLLBACK]${NC} 检测到错误 (退出码: $exit_code)，正在尝试恢复系统配置..."

        # 1. 恢复 bashrc
        if [ -f "$BASHRC_BACKUP" ]; then
            cp "$BASHRC_BACKUP" "$BASHRC_FILE"
            log_msg "${GREEN}[ROLLBACK]${NC} 已还原 /etc/bash.bashrc"
        fi

        log_msg "${RED}[ROLLBACK]${NC} 回滚完成。"
    fi
}

# 设置陷阱：当脚本非正常退出时执行回滚
trap rollback EXIT

# --- 功能函数 1: 配置审计日志 (DEBUG陷阱版 - 100%生效) ---
setup_audit_logging() {
    log_msg "${BLUE}[INFO]${NC} 正在配置全局审计日志..."

    # 1. 【新增】幂等性检查：如果配置已存在，则直接返回
    if grep -q "WGR_AUDIT_MARKER" "$BASHRC_FILE"; then
        log_msg "${GREEN}[SUCCESS]${NC} 审计日志配置已存在，跳过配置步骤。"
        return 0
    fi

    # 2. 确保日志目录和文件存在，并设置权限
    mkdir -p "$LOG_DIR"
    touch "$AUDIT_LOG"
    chmod 666 "$AUDIT_LOG"

    # 3. 备份原文件
    # 【改进】如果备份已存在，说明之前执行过，无需再次备份
    if [ ! -f "$BASHRC_BACKUP" ]; then
        cp "$BASHRC_FILE" "$BASHRC_BACKUP"
        log_msg "${BLUE}[INFO]${NC} 已创建备份: $BASHRC_BACKUP"
    else
        log_msg "${BLUE}[INFO]${NC} 备份文件已存在，跳过备份步骤。"
    fi

    # 4. 写入新配置
    cat >> "$BASHRC_FILE" << 'EOF'

# === WGR 审计配置 (自动添加) ===
# 唯一标记: WGR_AUDIT_MARKER

# 定义审计函数
wgr_audit() {
    local CMD="$BASH_COMMAND"

    # 1. 【核心过滤】忽略系统启动噪音
    # 只要命令包含以下特征，直接忽略（不记录）
    case "$CMD" in
        # 忽略 Shell 初始化循环
        *\ profile.d* | *\ .bashrc* | *\ .profile*)
            return 0
            ;;
        # 忽略 Shell 内部语法结构 (for, if, local, unset 等)
        *\ local\ * | *\ for\ * | *\ if\ * | *\ unset\ * | *\ return\ * | *\ shopt\ * | *\ trap\ *)
            return 0
            ;;
        # 忽略重定向和后台符号
        *\ \>\ * | *\ \&\ *)
            return 0
            ;;
    esac

    # 2. 获取时间
    local AUDIT_DATE=$(date "+%Y-%m-%d %H:%M:%S")

    # 3. 获取IP (处理 sudo 切换时的环境变量丢失问题)
    local AUDIT_IP
    if [ -n "$SSH_CLIENT" ]; then
        AUDIT_IP=$(echo ${SSH_CLIENT%% *} | grep -E "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$")
    fi

    # 如果还是空的，或者是本地回环，标记为 Local
    if [ -z "$AUDIT_IP" ]; then
        AUDIT_IP="Local"
    fi

    # 4. 写入日志
    if [[ -n "$CMD" ]]; then
        echo "[$AUDIT_DATE] [$USER] [IP:$AUDIT_IP] $CMD" >> "/wgr/log/wgr_audit.log"
    fi
}

# 启用 DEBUG 陷阱
trap wgr_audit DEBUG

EOF

    # 5. 验证语法
    if bash -c "source $BASHRC_FILE" 2>/dev/null; then
        log_msg "${GREEN}[SUCCESS]${NC} 审计日志配置写入成功。路径: $AUDIT_LOG"
    else
        log_msg "${RED}[ERROR]${NC} 写入后语法检查失败！"
        exit 1
    fi
}

# --- 功能函数 2: 设置时区 ---
set_timezone() {
    log_msg "${BLUE}[INFO]${NC} 正在设置时区为 Asia/Shanghai..."
    timedatectl set-timezone Asia/Shanghai
    if [ $? -eq 0 ]; then
        log_msg "${GREEN}[SUCCESS]${NC} 时区设置成功。当前时间: $(date)"
    else
        log_msg "${RED}[ERROR]${NC} 时区设置失败。"
        exit 1
    fi
}

# --- 功能函数 3: 配置静态 IP (Netplan 适配) ---
configure_static_ip() {
    log_msg "${BLUE}[INFO]${NC} 正在检测网络配置..."

    # 获取当前信息
    CURRENT_IP=$(hostname -I | awk '{print $1}')
    GATEWAY=$(ip route | grep default | awk '{print $3}' | head -1)
    NET_IFACE=$(ip -br link | grep -v LOOPBACK | awk '{print $1}' | head -1)

    log_msg "${BLUE}[INFO]${NC} 当前 IP: $CURRENT_IP | 网关: $GATEWAY | 网卡: $NET_IFACE"

    # 用户交互
    read -p "请输入您希望固定的 IP 地址 (直接回车保持当前 IP): " NEW_IP
    if [ -z "$NEW_IP" ]; then
        NEW_IP="$CURRENT_IP"
        log_msg "${BLUE}[INFO]${NC} 保持当前 IP: $NEW_IP"
        return 0
    fi

    # 识别 Netplan
    if [ -d /etc/netplan ]; then
        log_msg "${BLUE}[INFO]${NC} 检测到 Netplan，正在生成配置..."

        # 找到配置文件
        local netplan_file=$(ls /etc/netplan/*.yaml 2>/dev/null | head -1)
        if [ -z "$netplan_file" ]; then
            netplan_file="/etc/netplan/wgr-config.yaml"
            echo "network:" > "$netplan_file"
        fi

        # 备份 Netplan 配置
        cp "$netplan_file" "${netplan_file}.wgr_backup"

        # 写入配置
        cat > "$netplan_file" << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    $NET_IFACE:
      dhcp4: no
      addresses: [$NEW_IP/24]
      routes:
        - to: default
          via: $GATEWAY
      nameservers:
        addresses: [8.8.8.8, 114.114.114.114]
EOF
        log_msg "${BLUE}[INFO]${NC} Netplan 配置已更新，正在应用..."

        # 应用配置
        if netplan apply; then
            log_msg "${GREEN}[SUCCESS]${NC} IP 已立即生效为: $NEW_IP"
        else
            log_msg "${RED}[ERROR]${NC} Netplan apply 失败，请检查配置。"
        fi
    else
        log_msg "${RED}[ERROR]${NC} 未检测到 Netplan，跳过 IP 配置。"
    fi
}

# --- 主程序 ---
main() {
    log_msg "${BLUE}[INFO]${NC} 开始执行 0_基础配置..."

    # 1. 审计日志
    setup_audit_logging

    # 2. 时区
    set_timezone

    # 3. IP 配置
    configure_static_ip

    log_msg "${GREEN}[SUCCESS]${NC} =================================="
    log_msg "${GREEN}[SUCCESS]${NC} 基础配置全部完成！"
    log_msg "${GREEN}[SUCCESS]${NC} 审计日志路径: $AUDIT_LOG"

    # 成功执行完毕，移除回滚陷阱
    trap - EXIT
}

main "$@"

