#!/bin/bash

set -e  # 遇到错误立即退出

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

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

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

# 检查是否为root用户
check_root() {
    if [ "$EUID" -eq 0 ]; then
        log_warning "检测到以root用户运行，建议使用普通用户并在需要时使用sudo"
    fi
}

# 检测系统信息
detect_system() {
    log_info "检测系统信息..."
    
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$NAME
        VER=$VERSION_ID
        log_info "操作系统: $OS $VER"
    else
        log_error "无法检测操作系统版本"
        exit 1
    fi
    
    # 检测架构
    ARCH=$(uname -m)
    log_info "系统架构: $ARCH"
    
    case $ARCH in
        x86_64)
            HUGO_ARCH="64bit"
            ;;
        aarch64)
            HUGO_ARCH="ARM64"
            ;;
        armv7l)
            HUGO_ARCH="ARM"
            ;;
        *)
            log_error "不支持的架构: $ARCH"
            exit 1
            ;;
    esac
}

# 更新系统包
update_system() {
    log_info "更新系统包列表..."
    
    if command -v apt-get &> /dev/null; then
        sudo apt-get update -qq
        log_success "系统包列表更新完成"
    else
        log_error "此脚本仅支持基于apt的系统(Ubuntu/Debian)"
        exit 1
    fi
}

# 安装基本依赖
install_dependencies() {
    log_info "安装基本依赖..."
    
    local packages=(
        "curl"
        "wget"
        "git"
        "unzip"
        "build-essential"
        "ca-certificates"
    )
    
    for package in "${packages[@]}"; do
        if ! dpkg -l | grep -q "^ii  $package "; then
            log_info "安装 $package..."
            sudo apt-get install -y "$package" > /dev/null 2>&1
        else
            log_info "$package 已安装，跳过"
        fi
    done
    
    log_success "基本依赖安装完成"
}

# 安装Node.js和npm
install_nodejs() {
    log_info "检查Node.js安装状态..."
    
    if command -v node &> /dev/null; then
        NODE_VERSION=$(node --version)
        log_info "Node.js已安装: $NODE_VERSION"
    else
        log_info "安装Node.js..."
        
        # 使用NodeSource仓库安装最新LTS版本
        curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - > /dev/null 2>&1
        sudo apt-get install -y nodejs > /dev/null 2>&1
        
        log_success "Node.js安装完成: $(node --version)"
    fi
    
    # 检查npm
    if command -v npm &> /dev/null; then
        NPM_VERSION=$(npm --version)
        log_info "npm版本: $NPM_VERSION"
    else
        log_error "npm安装失败"
        exit 1
    fi
}

# 安装Hugo
install_hugo() {
    log_info "检查Hugo安装状态..."
    
    if command -v hugo &> /dev/null; then
        HUGO_VERSION=$(hugo version | head -n1)
        log_info "Hugo已安装: $HUGO_VERSION"
        
        # 检查是否为Extended版本
        if hugo version | grep -q "extended"; then
            log_success "检测到Hugo Extended版本"
            return 0
        else
            log_warning "检测到标准版Hugo，需要Extended版本来支持SASS"
        fi
    fi
    
    log_info "安装Hugo Extended..."
    
    # 获取最新版本号
    HUGO_LATEST=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
    
    if [ -z "$HUGO_LATEST" ]; then
        log_error "无法获取Hugo最新版本信息"
        exit 1
    fi
    
    log_info "最新Hugo版本: $HUGO_LATEST"
    
    # 构建下载URL
    HUGO_URL="https://github.com/gohugoio/hugo/releases/download/${HUGO_LATEST}/hugo_extended_${HUGO_LATEST#v}_linux-amd64.tar.gz"
    
    # 如果是ARM架构，调整URL
    if [ "$HUGO_ARCH" = "ARM64" ]; then
        HUGO_URL="https://github.com/gohugoio/hugo/releases/download/${HUGO_LATEST}/hugo_extended_${HUGO_LATEST#v}_linux-arm64.tar.gz"
    fi
    
    # 下载并安装Hugo
    TEMP_DIR=$(mktemp -d)
    cd "$TEMP_DIR"
    
    log_info "下载Hugo..."
    wget -q "$HUGO_URL" -O hugo.tar.gz
    
    log_info "解压Hugo..."
    tar -xzf hugo.tar.gz
    
    log_info "安装Hugo到系统..."
    sudo mv hugo /usr/local/bin/
    sudo chmod +x /usr/local/bin/hugo
    
    # 清理临时文件
    cd - > /dev/null
    rm -rf "$TEMP_DIR"
    
    # 验证安装
    if command -v hugo &> /dev/null; then
        HUGO_VERSION=$(hugo version | head -n1)
        log_success "Hugo安装完成: $HUGO_VERSION"
    else
        log_error "Hugo安装失败"
        exit 1
    fi
}

# 检查项目文件
check_project_files() {
    log_info "检查项目文件..."
    
    local required_files=(
        "hugo.toml"
        "layouts/index.html"
        "layouts/_default/baseof.html"
        "content/_index.md"
        "assets/scss/main.scss"
        "assets/ts/main.ts"
    )
    
    local missing_files=()
    
    for file in "${required_files[@]}"; do
        if [ ! -f "$file" ]; then
            missing_files+=("$file")
        fi
    done
    
    if [ ${#missing_files[@]} -gt 0 ]; then
        log_error "缺少以下必要文件:"
        for file in "${missing_files[@]}"; do
            echo "  - $file"
        done
        exit 1
    fi
    
    log_success "项目文件检查完成"
}

# 安装项目依赖
install_project_dependencies() {
    log_info "安装项目依赖..."
    
    if [ -f "package.json" ]; then
        log_info "发现package.json，安装npm依赖..."
        npm install --silent
        log_success "npm依赖安装完成"
    else
        log_info "未发现package.json，跳过npm依赖安装"
    fi
}

# 清理构建文件
clean_build() {
    log_info "清理旧的构建文件..."
    
    rm -rf public/
    rm -rf resources/_gen/
    rm -f .hugo_build.lock
    rm -f hugo_stats.json
    
    log_success "构建文件清理完成"
}

# 构建网站
build_site() {
    log_info "开始构建网站..."
    
    # 设置环境变量
    export HUGO_ENV=production
    export NODE_ENV=production
    
    # 执行构建
    if hugo --minify --cleanDestinationDir --environment production; then
        log_success "网站构建完成！"
    else
        log_error "网站构建失败！"
        exit 1
    fi
}

# 生成构建报告
generate_report() {
    log_info "生成构建报告..."
    
    if [ -d "public" ]; then
        local file_count=$(find public -type f | wc -l)
        local total_size=$(du -sh public | cut -f1)
        local html_files=$(find public -name "*.html" | wc -l)
        local css_files=$(find public -name "*.css" | wc -l)
        local js_files=$(find public -name "*.js" | wc -l)
        local image_files=$(find public \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" -o -name "*.ico" -o -name "*.svg" \) | wc -l)
        
        echo ""
        echo "=========================================="
        echo "           构建报告"
        echo "=========================================="
        echo "构建时间: $(date '+%Y-%m-%d %H:%M:%S')"
        echo "输出目录: $(pwd)/public"
        echo "文件总数: $file_count"
        echo "总大小: $total_size"
        echo ""
        echo "文件类型统计:"
        echo "  HTML文件: $html_files"
        echo "  CSS文件:  $css_files"
        echo "  JS文件:   $js_files"
        echo "  图片文件: $image_files"
        echo ""
        echo "部署说明:"
        echo "1. 将public/目录中的所有文件上传到Web服务器"
        echo "2. 或使用以下命令启动本地预览:"
        echo "   hugo server --environment production"
        echo "=========================================="
        echo ""
        
        log_success "构建报告生成完成"
    else
        log_error "构建输出目录不存在"
        exit 1
    fi
}

# 主函数
main() {
    echo ""
    echo "=========================================="
    echo "                构建脚本"
    echo "=========================================="
    echo ""
    
    # 检查当前目录是否为项目根目录
    if [ ! -f "hugo.toml" ]; then
        log_error "请在项目根目录运行此脚本"
        exit 1
    fi
    
    log_info "开始构建流程..."
    
    # 执行构建步骤
    check_root
    detect_system
    update_system
    install_dependencies
    install_nodejs
    install_hugo
    check_project_files
    install_project_dependencies
    clean_build
    build_site
    generate_report
    
    log_success "所有步骤完成！网站已成功构建。"
}

# 错误处理
trap 'log_error "脚本执行过程中发生错误，请检查上述输出"; exit 1' ERR

# 执行主函数
main "$@"
