#!/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"
}

# 显示欢迎信息
show_welcome() {
    echo -e "${GREEN}"
    echo "=================================================="
    echo "    智慧畜牧业小程序矩阵 - 项目初始化脚本"
    echo "=================================================="
    echo -e "${NC}"
    echo "本脚本将帮助您快速搭建开发环境并初始化项目"
    echo ""
}

# 检查系统环境
check_system() {
    log_info "检查系统环境..."
    
    # 检查操作系统
    if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        OS="Linux"
    elif [[ "$OSTYPE" == "darwin"* ]]; then
        OS="macOS"
    elif [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]]; then
        OS="Windows"
    else
        OS="Unknown"
    fi
    
    log_info "操作系统: $OS"
    
    # 检查必要工具
    local missing_tools=()
    
    if ! command -v git &> /dev/null; then
        missing_tools+=("git")
    fi
    
    if ! command -v node &> /dev/null; then
        missing_tools+=("node")
    fi
    
    if ! command -v npm &> /dev/null; then
        missing_tools+=("npm")
    fi
    
    if [ ${#missing_tools[@]} -gt 0 ]; then
        log_error "缺少必要工具: ${missing_tools[*]}"
        log_info "请先安装以下工具："
        for tool in "${missing_tools[@]}"; do
            echo "  - $tool"
        done
        exit 1
    fi
    
    log_success "系统环境检查通过"
}

# 检查Node.js版本
check_node_version() {
    log_info "检查Node.js版本..."
    
    local node_version=$(node --version | sed 's/v//')
    local major_version=$(echo $node_version | cut -d. -f1)
    
    if [ "$major_version" -lt 14 ]; then
        log_error "Node.js版本过低 (当前: $node_version，要求: >= 14.0.0)"
        log_info "请升级Node.js到14.0.0或更高版本"
        exit 1
    fi
    
    log_success "Node.js版本检查通过 (版本: $node_version)"
}

# 初始化项目目录
init_project_structure() {
    log_info "初始化项目目录结构..."
    
    # 确保在正确的目录
    if [ ! -f "README.md" ]; then
        log_error "请在项目根目录下运行此脚本"
        exit 1
    fi
    
    # 创建必要的目录
    local directories=(
        "mini_program/builds"
        "mini_program/tests"
        "mini_program/docs"
        "logs"
        "temp"
    )
    
    for dir in "${directories[@]}"; do
        if [ ! -d "$dir" ]; then
            mkdir -p "$dir"
            log_info "创建目录: $dir"
        fi
    done
    
    log_success "项目目录结构初始化完成"
}

# 安装项目依赖
install_dependencies() {
    log_info "安装项目依赖..."
    
    cd mini_program
    
    # 检查package.json是否存在
    if [ ! -f "package.json" ]; then
        log_error "package.json文件不存在"
        exit 1
    fi
    
    # 清理旧的依赖
    if [ -d "node_modules" ]; then
        log_info "清理旧的依赖..."
        rm -rf node_modules
    fi
    
    if [ -f "package-lock.json" ]; then
        rm -f package-lock.json
    fi
    
    # 安装依赖
    log_info "正在安装依赖，请稍候..."
    if npm install --silent; then
        log_success "依赖安装完成"
    else
        log_error "依赖安装失败"
        exit 1
    fi
    
    cd ..
}

# 配置开发环境
setup_dev_environment() {
    log_info "配置开发环境..."
    
    cd mini_program
    
    # 复制环境配置文件
    if [ ! -f ".env.local" ]; then
        if [ -f ".env.development" ]; then
            cp .env.development .env.local
            log_info "创建本地环境配置文件"
        fi
    fi
    
    # 设置Git hooks
    if [ -d ".git" ]; then
        # 创建pre-commit hook
        cat > .git/hooks/pre-commit << 'EOF'
#!/bin/bash
# 运行代码检查
npm run lint
if [ $? -ne 0 ]; then
    echo "代码检查失败，请修复后再提交"
    exit 1
fi

# 运行测试
npm test
if [ $? -ne 0 ]; then
    echo "测试失败，请修复后再提交"
    exit 1
fi
EOF
        chmod +x .git/hooks/pre-commit
        log_info "设置Git pre-commit hook"
    fi
    
    cd ..
    
    log_success "开发环境配置完成"
}

# 初始化数据库
init_database() {
    log_info "初始化数据库..."
    
    # 这里可以添加数据库初始化逻辑
    # 例如：运行SQL脚本、创建表结构等
    
    log_info "数据库初始化功能待实现"
}

# 生成开发文档
generate_docs() {
    log_info "生成开发文档..."
    
    cd mini_program
    
    # 生成API文档
    if command -v jsdoc &> /dev/null; then
        jsdoc -c jsdoc.conf.json
        log_info "API文档生成完成"
    else
        log_warning "JSDoc未安装，跳过API文档生成"
    fi
    
    cd ..
    
    log_success "文档生成完成"
}

# 运行初始测试
run_initial_tests() {
    log_info "运行初始测试..."
    
    cd mini_program
    
    # 运行代码检查
    if npm run lint &> /dev/null; then
        log_success "代码检查通过"
    else
        log_warning "代码检查发现问题，建议修复"
    fi
    
    # 运行单元测试
    if npm test &> /dev/null; then
        log_success "单元测试通过"
    else
        log_warning "单元测试发现问题，建议检查"
    fi
    
    # 尝试构建项目
    if npm run build:h5 &> /dev/null; then
        log_success "项目构建成功"
    else
        log_warning "项目构建失败，请检查配置"
    fi
    
    cd ..
}

# 创建开发者配置
create_dev_config() {
    log_info "创建开发者配置..."
    
    # 获取用户信息
    read -p "请输入您的姓名: " dev_name
    read -p "请输入您的邮箱: " dev_email
    
    # 创建开发者配置文件
    cat > .devconfig << EOF
# 开发者配置文件
DEV_NAME="$dev_name"
DEV_EMAIL="$dev_email"
INIT_DATE="$(date '+%Y-%m-%d %H:%M:%S')"
PROJECT_VERSION="1.0.0"
EOF
    
    # 配置Git用户信息
    if [ -n "$dev_name" ] && [ -n "$dev_email" ]; then
        git config user.name "$dev_name"
        git config user.email "$dev_email"
        log_info "Git用户信息配置完成"
    fi
    
    log_success "开发者配置创建完成"
}

# 显示完成信息
show_completion() {
    echo ""
    echo -e "${GREEN}=================================================="
    echo "           项目初始化完成！"
    echo "==================================================${NC}"
    echo ""
    echo "🎉 恭喜！智慧畜牧业小程序矩阵项目已成功初始化"
    echo ""
    echo "📁 项目结构："
    echo "   ├── mini_program/     # 小程序源码"
    echo "   ├── scripts/          # 构建脚本"
    echo "   ├── docs/             # 项目文档"
    echo "   └── README.md         # 项目说明"
    echo ""
    echo "🚀 快速开始："
    echo "   cd mini_program"
    echo "   npm run dev:mp-weixin    # 启动微信小程序开发"
    echo "   npm run dev:h5           # 启动H5开发"
    echo "   npm run build:all        # 构建所有平台"
    echo ""
    echo "🛠️ 常用命令："
    echo "   npm run lint             # 代码检查"
    echo "   npm run test             # 运行测试"
    echo "   npm run format           # 代码格式化"
    echo "   ./scripts/build.sh       # 批量构建"
    echo "   ./scripts/deploy.sh      # 部署脚本"
    echo ""
    echo "📚 文档地址："
    echo "   - 技术文档: docs/development/"
    echo "   - API文档: mini_program/docs/"
    echo "   - 项目说明: README.md"
    echo ""
    echo "❓ 需要帮助？"
    echo "   - 查看文档: cat README.md"
    echo "   - 运行帮助: ./scripts/build.sh --help"
    echo "   - 联系团队: dev@xlxumu.com"
    echo ""
    echo -e "${YELLOW}注意事项：${NC}"
    echo "   1. 请确保已安装微信开发者工具"
    echo "   2. 开发前请阅读技术文档"
    echo "   3. 提交代码前请运行测试"
    echo ""
    echo -e "${GREEN}祝您开发愉快！${NC}"
}

# 错误处理
error_handler() {
    local line_number=$1
    log_error "初始化脚本在第 $line_number 行出错"
    log_error "请检查错误信息并重新运行脚本"
    exit 1
}

# 清理函数
cleanup() {
    log_info "清理临时文件..."
    # 清理可能的临时文件
    rm -f temp_*
}

# 显示帮助信息
show_help() {
    echo "智慧畜牧业小程序矩阵 - 项目初始化脚本"
    echo ""
    echo "用法:"
    echo "  $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help     显示帮助信息"
    echo "  -q, --quiet    静默模式，减少输出"
    echo "  -f, --force    强制重新初始化"
    echo "  --skip-deps    跳过依赖安装"
    echo "  --skip-tests   跳过初始测试"
    echo ""
    echo "示例:"
    echo "  $0             # 完整初始化"
    echo "  $0 --quiet     # 静默初始化"
    echo "  $0 --force     # 强制重新初始化"
}

# 主函数
main() {
    local quiet_mode=false
    local force_mode=false
    local skip_deps=false
    local skip_tests=false
    
    # 解析参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -q|--quiet)
                quiet_mode=true
                shift
                ;;
            -f|--force)
                force_mode=true
                shift
                ;;
            --skip-deps)
                skip_deps=true
                shift
                ;;
            --skip-tests)
                skip_tests=true
                shift
                ;;
            *)
                log_error "未知参数: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    # 设置静默模式
    if [ "$quiet_mode" = true ]; then
        exec > /dev/null 2>&1
    fi
    
    # 显示欢迎信息
    if [ "$quiet_mode" = false ]; then
        show_welcome
    fi
    
    # 检查是否已初始化
    if [ -f ".devconfig" ] && [ "$force_mode" = false ]; then
        log_warning "项目似乎已经初始化过了"
        read -p "是否要重新初始化？(y/N): " confirm
        if [[ ! $confirm =~ ^[Yy]$ ]]; then
            log_info "初始化已取消"
            exit 0
        fi
    fi
    
    # 执行初始化步骤
    check_system
    check_node_version
    init_project_structure
    
    if [ "$skip_deps" = false ]; then
        install_dependencies
    fi
    
    setup_dev_environment
    init_database
    generate_docs
    
    if [ "$skip_tests" = false ]; then
        run_initial_tests
    fi
    
    create_dev_config
    
    # 显示完成信息
    if [ "$quiet_mode" = false ]; then
        show_completion
    fi
    
    log_success "项目初始化完成！"
}

# 设置错误处理和清理
trap 'error_handler $LINENO' ERR
trap cleanup EXIT

# 执行主函数
main "$@"