/**
 * mysql 数据层
 */

import { TablesConfig } from "../config/mysqlTableConfig";
import { mysqlDB } from "../db/mysqlInit";

let mysqlModelMap = {};

export async function initMysqlModel() {
    console.log('🚀 开始初始化 MySQL 模型...');
    
    // 检查 TablesConfig
    if (!TablesConfig || !Array.isArray(TablesConfig)) {
        console.error('❌ TablesConfig 未定义或不是数组');
        return;
    }
    
    if (TablesConfig.length === 0) {
        console.warn('⚠️ TablesConfig 是空数组');
        return;
    }
    
    console.log(`📊 共发现 ${TablesConfig.length} 个表配置`);

    /**第一步：初始化所有表 */
    for (let i = 0; i < TablesConfig.length; i++) {
        let { tableName, schema } = TablesConfig[i];
        
        if (!tableName) {
            console.warn(`⚠️ 第 ${i} 个表配置缺少 tableName，跳过`);
            continue;
        }
        
        if (!schema) {
            console.warn(`⚠️ 表 ${tableName} 缺少 schema 配置，跳过`);
            continue;
        }
        
        console.log(`🔄 正在初始化表: ${tableName}`);

        let schemaConf = {
            freezeTableName: true,
            timestamps: false
        };

        try {
            let model = mysqlDB.define(tableName, schema, schemaConf);
            mysqlModelMap[tableName] = await model.sync({});
            console.log(`✅ 表 ${tableName} 初始化成功`);
        } catch (error) {
            console.error(`❌ 表 ${tableName} 初始化失败:`, error);
        }
    }

    console.log(`📊 表初始化完成，成功初始化 ${Object.keys(mysqlModelMap).length} 个表`);

    /**第二步：初始化表关联 */
    for (let i = 0; i < TablesConfig.length; i++) {
        let { tableName, association } = TablesConfig[i];
        
        // 检查表是否初始化成功
        if (!mysqlModelMap[tableName]) {
            console.warn(`⚠️ 表 ${tableName} 未成功初始化，跳过关联配置`);
            continue;
        }
        
        // 检查关联配置
        if (!association || !Array.isArray(association) || association.length === 0) {
            console.log(`ℹ️ 表 ${tableName} 没有关联配置，跳过`);
            continue;
        }
        
        console.log(`🔄 正在初始化表 ${tableName} 的关联关系，共 ${association.length} 个关联`);

        association.forEach((item: any, index: number) => {
            if (!item) {
                console.warn(`⚠️ 表 ${tableName} 的第 ${index} 个关联配置为空，跳过`);
                return;
            }
            
            let { type, check, foreignKey } = item;
            
            if (!type || !check) {
                console.warn(`⚠️ 表 ${tableName} 的关联配置缺少 type 或 check 字段`, item);
                return;
            }
            
            // 检查关联表是否初始化成功
            if (!mysqlModelMap[check]) {
                console.warn(`⚠️ 关联表 ${check} 未初始化，跳过关联`);
                return;
            }
            
            try {
                console.log(`  处理关联: ${tableName} -> ${check}, 类型: ${type}`);
                
                if (type == "hasOne") {
                    mysqlModelMap[check].hasOne(mysqlModelMap[tableName]);
                } else if (type == "hasMany") {
                    mysqlModelMap[tableName].hasMany(mysqlModelMap[check], { foreignKey });
                }
                
                mysqlModelMap[check].belongsTo(mysqlModelMap[tableName], { foreignKey });
                
                console.log(`  ✅ 关联成功: ${tableName} <-> ${check}`);
            } catch (error) {
                console.error(`  ❌ 关联失败: ${tableName} -> ${check}`, error);
            }
        });
    }

    console.log('🎉 MySQL 模型初始化完成');
    console.log('📋 已初始化的表:', Object.keys(mysqlModelMap).join(', '));
}

export { mysqlModelMap };

    
    
    
    
    
    