#!/bin/bash

# 检查是否以root权限运行
if [ "$EUID" -ne 0 ]; then
    echo "错误: 此脚本必须以root权限运行"
    echo "请使用: sudo bash $0"
    exit 1
fi

# 定义变量
DTB_BASE_URL="https://cdn.wifilu.com/fnnas/dtb/amlogic/"
DTB_DIR="/boot/dtb/amlogic"
UENV_FILE="/boot/uEnv.txt"
FNENV_FILE="/boot/fnEnv.txt"

echo "正在查找可用的 DTB 文件..."

# 获取本地 oes-plus 相关的 DTB 文件列表
LOCAL_DTBS=()
if [ -d "$DTB_DIR" ]; then
    LOCAL_DTBS+=($(find "$DTB_DIR" -name "*oes-plus*.dtb" -exec basename {} \; 2>/dev/null))
fi

# 获取远程 oes-plus 相关的 DTB 文件列表，使用原始的远程配置
REMOTE_DTBS=("meson-g12b-s922x-oes-plus-wifilu.com.dtb")

# 显示选项给用户
echo ""
echo "找到以下 oes-plus 相关的 DTB 文件："
echo ""

# 显示本地文件
echo "本地文件（/boot/dtb/amlogic/）："
local_index=1
for dtb in "${LOCAL_DTBS[@]}"; do
    echo "  [$local_index] $dtb (本地)"
    ((local_index++))
done

total_local=$local_index
total_local=$((total_local - 1))

# 显示远程文件
echo ""
echo "远程文件（$DTB_BASE_URL）："
remote_index=1
for dtb in "${REMOTE_DTBS[@]}"; do
    remote_num=$((local_index + remote_index - 1))
    echo "  [$remote_num] $dtb (远程)"
    ((remote_index++))
done

total_remote=$((remote_index - 1))
total_options=$((total_local + total_remote))

echo ""
echo "总共 $total_options 个选项 ($total_local 个本地, $total_remote 个远程)"
echo ""

# 用户选择
read -p "请选择要使用的 DTB 文件编号 [1-$((total_local + total_remote))]: " choice

# 验证输入
if ! [[ "$choice" =~ ^[0-9]+$ ]] || [ "$choice" -lt 1 ] || [ "$choice" -gt $((total_local + total_remote)) ]; then
    echo "错误：无效的选择！"
    exit 1
fi

# 确定选择的文件
if [ "$choice" -le "$total_local" ]; then
    # 本地文件
    SELECTED_DTB="${LOCAL_DTBS[$((choice - 1))]}"
    IS_REMOTE=false
    echo "选择了本地文件: $SELECTED_DTB"
else
    # 远程文件
    remote_choice=$((choice - total_local))
    SELECTED_DTB="${REMOTE_DTBS[$((remote_choice - 1))]}"
    IS_REMOTE=true
    echo "选择了远程文件: $SELECTED_DTB"
fi

# 检查 uEnv.txt 文件是否存在
if [ ! -f "$UENV_FILE" ]; then
    echo "错误: $UENV_FILE 不存在！"
    exit 1
fi

# 如果是远程文件，先下载
if [ "$IS_REMOTE" = true ]; then
    TEMP_DIR=$(mktemp -d)
    cd "$TEMP_DIR"
    
    echo "正在下载 DTB 文件..."
    DTB_URL="$DTB_BASE_URL$SELECTED_DTB"
    
    if ! wget -q "$DTB_URL" -O "$SELECTED_DTB"; then
        echo "下载失败！"
        rm -rf "$TEMP_DIR"
        exit 1
    fi
    
    echo "下载完成: $SELECTED_DTB"
    
    # 检查目标目录是否存在，不存在则创建
    if [ ! -d "$DTB_DIR" ]; then
        echo "创建目录: $DTB_DIR"
        mkdir -p "$DTB_DIR"
    fi
    
    # 检查本地是否已存在同名文件，如果存在则生成新文件名
    ORIGINAL_SELECTED_DTB="$SELECTED_DTB"
    FINAL_DTB_PATH="$DTB_DIR/$ORIGINAL_SELECTED_DTB"
    if [ -f "$FINAL_DTB_PATH" ]; then
        # 生成不冲突的文件名 (例如: filename-1.dtb, filename-2.dtb, 等等)
        counter=1
        name_without_ext="${ORIGINAL_SELECTED_DTB%.*}"
        extension="${ORIGINAL_SELECTED_DTB##*.}"
        
        # 查找下一个未被使用的文件名
        while [ -f "$DTB_DIR/${name_without_ext}-${counter}.${extension}" ]; do
            ((counter++))
        done
        
        NEW_FILENAME="${name_without_ext}-${counter}.${extension}"
        FINAL_DTB_PATH="$DTB_DIR/$NEW_FILENAME"
        SELECTED_DTB="$NEW_FILENAME"
        
        echo "检测到本地已存在同名文件，重命名为: $SELECTED_DTB"
    fi
    
    # 复制 DTB 文件到目标目录（直接覆盖同名文件）
    echo "复制 DTB 文件到 $DTB_DIR"
    cp "$TEMP_DIR/$ORIGINAL_SELECTED_DTB" "$FINAL_DTB_PATH"
    
    # 清理临时文件
    rm -rf "$TEMP_DIR"
fi

# 修改 uEnv.txt 的第三行，更新 dtb 路径
echo "修改 $UENV_FILE 的dtb路径..."

# 使用 sed 修改第三行，格式为 FDT=/dtb/amlogic/xxx.dtb
# 在sudo环境下确保sed命令能正常执行
if ! sed -i "3s|FDT=.*|FDT=/dtb/amlogic/$SELECTED_DTB|" "$UENV_FILE"; then
    echo "错误: 无法修改 $UENV_FILE 文件，请检查权限！"
    exit 1
fi
echo "uEnv.txt FDT路径已更新为: FDT=/dtb/amlogic/$SELECTED_DTB"
# 检查 fnEnv.txt 文件是否存在，如果存在则也更新它
if [ -f "$FNENV_FILE" ]; then
    echo "修改 $FNENV_FILE 的dtb路径..."
    # 更新 fdtfile 行，格式为 fdtfile=amlogic/xxx.dtb
    if ! sed -i "s|^fdtfile=.*|fdtfile=amlogic/$SELECTED_DTB|" "$FNENV_FILE"; then
        echo "警告: 无法修改 $FNENV_FILE 文件"
    else
        echo "fnEnv.txt fdtfile路径已更新为: fdtfile=amlogic/$SELECTED_DTB"
    fi
else
    echo "fnEnv.txt 不存在，跳过更新"
fi


echo "配置更新完成，正在进行验证..."

# 验证流程
echo ""
echo "正在进行验证流程..."

# 验证1: 检查DTB文件是否已复制
echo "验证1: 检查DTB文件是否真实存在..."
DTB_PATH="$DTB_DIR/$SELECTED_DTB"
if [ -f "$DTB_PATH" ]; then
    # 检查文件大小是否合理（大于1KB）
    FILE_SIZE=$(stat -c%s "$DTB_PATH" 2>/dev/null)
    if [ $? -eq 0 ] && [ "$FILE_SIZE" -gt 1024 ]; then
        # 额外验证：检查文件头部是否包含DTB魔数 (0xd00dfeed)，但不强制要求
        if od -N 4 -t x4 "$DTB_PATH" 2>/dev/null | grep -q "d00dfeed"; then
            echo "  ✓ DTB文件真实存在且格式正确: $DTB_PATH (大小: ${FILE_SIZE} 字节)"
        else
            echo "  ✓ DTB文件存在且大小正常: $DTB_PATH (大小: ${FILE_SIZE} 字节) - 文件格式检查略过"
        fi
    else
        echo "  ✗ 错误: DTB文件太小或无法访问: $DTB_PATH (大小: ${FILE_SIZE} 字节)"
    fi
else
    echo "  ✗ 错误: DTB文件不存在: $DTB_PATH"
fi

# 验证2: 检查uEnv.txt配置是否已修改
echo "验证2: 检查uEnv.txt配置..."
if [ -f "$UENV_FILE" ]; then
    UENV_LINE3=$(sed -n '3p' "$UENV_FILE" 2>/dev/null)
    if [[ "$UENV_LINE3" == *"FDT=/dtb/amlogic/$SELECTED_DTB"* ]]; then
        echo "  ✓ uEnv.txt FDT配置已正确更新: $UENV_LINE3"
    else
        echo "  ✗ 错误: uEnv.txt FDT配置未正确更新，当前内容: $UENV_LINE3"
    fi
else
    echo "  ✗ 错误: uEnv.txt文件不存在"
fi

# 验证3: 检查fnEnv.txt配置是否已修改
echo "验证3: 检查fnEnv.txt配置..."
if [ -f "$FNENV_FILE" ]; then
    FNENV_FDTFILE=$(grep "^fdtfile=" "$FNENV_FILE" 2>/dev/null)
    if [[ "$FNENV_FDTFILE" == *"fdtfile=amlogic/$SELECTED_DTB"* ]]; then
        echo "  ✓ fnEnv.txt fdtfile配置已正确更新: $FNENV_FDTFILE"
    else
        echo "  ✗ 错误: fnEnv.txt fdtfile配置未正确更新，当前内容: $FNENV_FDTFILE"
    fi
else
    echo "  i 信息: fnEnv.txt文件不存在，跳过此项验证"
fi

echo ""
echo "验证流程完成！"
