#!/bin/bash
# OpenWrt 构建脚本 - TP842N-V3 打印服务器固件

set -euo pipefail

# 配置变量
OPENWRT_VERSION="23.05.3"
TARGET="ar71xx/generic"
PROFILE="tl-wr842n-v3"
BUILD_DIR="openwrt"
CONFIG_FILE=".config"
CORES=$(nproc)

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查构建环境
check_environment() {
    log_info "检查构建环境..."
    
    # 检查 Ubuntu 版本
    if ! grep -q "Ubuntu 22.04" /etc/os-release; then
        log_warn "建议使用 Ubuntu 22.04 LTS 以获得最佳兼容性"
    fi
    
    # 检查磁盘空间
    available_space=$(df . | tail -1 | awk '{print $4}')
    if [ "$available_space" -lt 20971520 ]; then # 20GB in KB
        log_error "可用磁盘空间不足 20GB,构建可能失败"
        exit 1
    fi
    
    # 检查内存
    total_memory=$(free -m | awk 'NR==2{print $2}')
    if [ "$total_memory" -lt 4096 ]; then
        log_warn "内存不足 4GB,构建速度可能较慢"
    fi
    
    log_info "环境检查通过"
}

# 安装依赖
install_dependencies() {
    log_info "安装构建依赖..."
    
    sudo apt update
    sudo apt upgrade
    sudo apt install -y \
        build-essential ccache ecj fastjar file g++ gawk \
        gettext git java-propose-classpath libelf-dev libncurses5-dev \
        libncursesw5-dev libssl-dev 2to3 python2 python-is-python3 python3 unzip wget \
        python3-distutils python3-setuptools python3-dev rsync subversion \
        swig time xsltproc zlib1g-dev
        
    log_info "依赖安装完成"
}

# 下载 OpenWrt 源码
download_source() {
    log_info "下载 OpenWrt 源码..."
    
    if [ ! -d "$BUILD_DIR" ]; then
        git clone https://gitcode.com/lh85558/openwrt.git "$BUILD_DIR" -b v${OPENWRT_VERSION}
    else
        log_info "源码目录已存在,更新源码..."
        cd "$BUILD_DIR"
        git fetch origin
        git checkout v${OPENWRT_VERSION}
        git pull origin v${OPENWRT_VERSION}
        cd ..
    fi
    
    log_info "源码准备完成"
}

# 更新和安装 feeds
update_feeds() {
    log_info "更新 feeds..."
    
    cd "$BUILD_DIR"
    
    # 使用国内镜像源
    sed -i 's_git.openwrt.org/project_git.openwrt.org.cn_mirror_g' feeds.conf.default
    sed -i 's_downloads.openwrt.org_downloads.openwrt.org.cn_mirror_g' feeds.conf.default
    
    ./scripts/feeds update -a
    ./scripts/feeds install -a
    
    cd ..
    log_info "Feeds 更新完成"
}

# 应用配置文件
apply_config() {
    log_info "应用配置文件..."
    
    cd "$BUILD_DIR"
    
    # 复制配置文件
    cp ../"$CONFIG_FILE" .
    
    # 使配置生效
    make defconfig
    
    cd ..
    log_info "配置应用完成"
}

# 下载依赖包
download_packages() {
    log_info "下载依赖包..."
    
    cd "$BUILD_DIR"
    make download -j${CORES} V=s
    cd ..
    
    log_info "依赖包下载完成"
}

# 编译固件
compile_firmware() {
    log_info "开始编译固件..."
    
    cd "$BUILD_DIR"
    
    # 清理之前的构建
    make clean
    
    # 开始编译
    log_info "使用 ${CORES} 个核心进行编译..."
    make -j${CORES} V=s
    
    cd ..
    log_info "编译完成"
}

# 复制固件到输出目录
copy_firmware() {
    log_info "复制固件到输出目录..."
    
    mkdir -p output
    cd "$BUILD_DIR"
    
    # 查找生成的固件
    firmware_file=$(find bin/targets/${TARGET} -name "*${PROFILE}*sysupgrade.bin" | head -1)
    
    if [ -n "$firmware_file" ] && [ -f "$firmware_file" ]; then
        cp "$firmware_file" ../output/
        log_info "固件已复制到 output/ 目录"
        log_info "固件文件: $(basename "$firmware_file")"
    else
        log_error "未找到生成的固件文件"
        exit 1
    fi
    
    cd ..
}

# 显示构建信息
show_build_info() {
    log_info "构建信息:"
    echo "目标设备: $PROFILE"
    echo "OpenWrt 版本: $OPENWRT_VERSION"
    echo "构建时间: $(date)"
    echo "输出目录: $(pwd)/output"
    
    if [ -d "output" ]; then
        echo "生成的文件:"
        ls -la output/
    fi
}

# 主函数
main() {
    log_info "开始构建 TP842N-V3 打印服务器固件..."
    
    check_environment
    install_dependencies
    download_source
    update_feeds
    apply_config
    download_packages
    compile_firmware
    copy_firmware
    show_build_info
    
    log_info "构建完成!固件位于 output/ 目录"
}

# 运行主函数
main "$@"