/**
 * @文件: init-system-db.ts
 * @作者: 阿瑞
 * @功能: 系统数据库初始化
 * @版本: 1.0.0
 */

import mysql from 'mysql2/promise';
import DbConfig from './config';

/**
 * 系统数据库初始化类
 * 负责创建和维护系统所需的基础数据表结构
 */
export class SystemDBInitializer {
  /**
   * 表创建SQL定义
   * 系统所需的所有表结构
   */
  private static readonly TABLE_DEFINITIONS: Record<string, string> = {
    // 工作空间表
    workspaces: `
      CREATE TABLE IF NOT EXISTS \`workspaces\` (
        \`id\` int NOT NULL AUTO_INCREMENT COMMENT '空间ID（主键）',
        \`name\` varchar(50) NOT NULL COMMENT '空间名称',
        \`creator_id\` int NOT NULL COMMENT '创建者用户ID',
        \`status\` tinyint NOT NULL DEFAULT '1' COMMENT '状态（1=活跃，0=停用）',
        \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
        \`updated_at\` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
        PRIMARY KEY (\`id\`),
        KEY \`idx_creator_id\` (\`creator_id\`) COMMENT '创建者ID索引，提高查询效率'
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工作空间信息表'
    `,
    
    // 系统用户表
    system_users: `
      CREATE TABLE IF NOT EXISTS \`system_users\` (
        \`id\` int NOT NULL AUTO_INCREMENT COMMENT '用户ID（主键）',
        \`username\` varchar(50) NOT NULL COMMENT '登录用户名（唯一）',
        \`password\` varchar(100) NOT NULL COMMENT '加密密码',
        \`email\` varchar(100) NOT NULL COMMENT '电子邮箱（唯一）',
        \`phone\` varchar(20) NOT NULL COMMENT '手机号码（唯一）',
        \`workspace_id\` int NOT NULL COMMENT '所属工作空间ID',
        \`role_type\` varchar(30) NOT NULL DEFAULT 'user' COMMENT '角色类型',
        \`role_name\` varchar(50) NOT NULL DEFAULT '普通用户' COMMENT '角色显示名称',
        \`is_custom_role\` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否自定义角色（1=是，0=否）',
        \`status\` tinyint NOT NULL DEFAULT '1' COMMENT '状态（1=启用，0=禁用）',
        \`invited_by\` int DEFAULT NULL COMMENT '邀请人ID（NULL表示自主注册）',
        \`invitation_token\` varchar(100) DEFAULT NULL COMMENT '邀请验证令牌',
        \`last_login_at\` datetime DEFAULT NULL COMMENT '最后登录时间',
        \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
        \`updated_at\` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
        PRIMARY KEY (\`id\`),
        UNIQUE KEY \`uk_username\` (\`username\`),
        UNIQUE KEY \`uk_email\` (\`email\`),
        UNIQUE KEY \`uk_phone\` (\`phone\`),
        KEY \`idx_workspace_id\` (\`workspace_id\`),
        KEY \`idx_invited_by\` (\`invited_by\`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表'
    `,
    
    // 用户角色表
    user_roles: `
      CREATE TABLE IF NOT EXISTS \`user_roles\` (
        \`id\` int NOT NULL AUTO_INCREMENT COMMENT '角色ID（主键）',
        \`type\` varchar(30) NOT NULL COMMENT '角色类型',
        \`name\` varchar(50) NOT NULL COMMENT '角色显示名称',
        \`is_custom\` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否自定义（1=是，0=否）',
        \`workspace_id\` int NOT NULL COMMENT '所属工作空间ID',
        \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
        \`updated_at\` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
        PRIMARY KEY (\`id\`),
        UNIQUE KEY \`uk_type_workspace\` (\`type\`, \`workspace_id\`),
        KEY \`idx_workspace_id\` (\`workspace_id\`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色表'
    `,
    
    // 团队表
    teams: `
      CREATE TABLE IF NOT EXISTS \`teams\` (
        \`id\` int NOT NULL AUTO_INCREMENT COMMENT '团队ID（主键）',
        \`team_code\` varchar(30) NOT NULL COMMENT '团队唯一编码',
        \`name\` varchar(50) NOT NULL COMMENT '团队名称',
        \`db_host\` varchar(100) NOT NULL COMMENT '数据库主机地址',
        \`db_name\` varchar(50) NOT NULL COMMENT '数据库名称',
        \`db_username\` varchar(50) NOT NULL COMMENT '数据库用户名',
        \`db_password\` varchar(100) NOT NULL COMMENT '数据库密码',
        \`workspace_id\` int NOT NULL COMMENT '所属工作空间ID',
        \`owner_id\` int NOT NULL COMMENT '团队管理员ID',
        \`status\` tinyint NOT NULL DEFAULT '1' COMMENT '状态（1=正常，0=停用）',
        \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
        \`updated_at\` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
        PRIMARY KEY (\`id\`),
        UNIQUE KEY \`uk_team_code\` (\`team_code\`),
        KEY \`idx_workspace_id\` (\`workspace_id\`),
        KEY \`idx_owner_id\` (\`owner_id\`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='团队信息表'
    `,
    
    // 用户-团队关系表
    user_team_relations: `
      CREATE TABLE IF NOT EXISTS \`user_team_relations\` (
        \`id\` int NOT NULL AUTO_INCREMENT COMMENT '关系ID（主键）',
        \`user_id\` int NOT NULL COMMENT '用户ID',
        \`team_id\` int NOT NULL COMMENT '团队ID',
        \`role\` varchar(20) NOT NULL DEFAULT 'member' COMMENT '角色（owner=拥有者，admin=管理员，member=成员）',
        \`created_at\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
        \`updated_at\` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
        PRIMARY KEY (\`id\`),
        UNIQUE KEY \`uk_user_team\` (\`user_id\`,\`team_id\`) COMMENT '确保用户在一个团队中只有一个角色',
        KEY \`idx_team_id\` (\`team_id\`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户团队关系表'
    `
  };

  /**
   * 外键定义
   * 定义表之间的关系
   */
  private static readonly FOREIGN_KEY_DEFINITIONS: string[] = [
    // 系统用户表的外键
    `ALTER TABLE \`system_users\` 
     ADD CONSTRAINT \`fk_user_workspace\` FOREIGN KEY (\`workspace_id\`) REFERENCES \`workspaces\` (\`id\`),
     ADD CONSTRAINT \`fk_user_inviter\` FOREIGN KEY (\`invited_by\`) REFERENCES \`system_users\` (\`id\`)`,
    
    // 用户角色表的外键
    `ALTER TABLE \`user_roles\` 
     ADD CONSTRAINT \`fk_role_workspace\` FOREIGN KEY (\`workspace_id\`) REFERENCES \`workspaces\` (\`id\`)`,
     
    // 团队表的外键
    `ALTER TABLE \`teams\` 
     ADD CONSTRAINT \`fk_team_workspace\` FOREIGN KEY (\`workspace_id\`) REFERENCES \`workspaces\` (\`id\`),
     ADD CONSTRAINT \`fk_team_owner\` FOREIGN KEY (\`owner_id\`) REFERENCES \`system_users\` (\`id\`)`,
    
    // 用户-团队关系表的外键
    `ALTER TABLE \`user_team_relations\` 
     ADD CONSTRAINT \`fk_relation_user\` FOREIGN KEY (\`user_id\`) REFERENCES \`system_users\` (\`id\`),
     ADD CONSTRAINT \`fk_relation_team\` FOREIGN KEY (\`team_id\`) REFERENCES \`teams\` (\`id\`)`
  ];

  /**
   * 初始化系统数据库
   * 执行所有表创建和外键关联操作
   */
  public static async initialize(): Promise<void> {
    console.log('开始初始化系统数据库...');
    
    const connection = await mysql.createConnection({
      host: DbConfig.host,
      port: DbConfig.port,
      user: DbConfig.adminUser,
      password: DbConfig.adminPassword,
      database: DbConfig.database,
      multipleStatements: true
    });
    
    try {
      // 创建所有表
      for (const [tableName, createTableSQL] of Object.entries(this.TABLE_DEFINITIONS)) {
        console.log(`正在创建表: ${tableName}`);
        await connection.query(createTableSQL);
      }

      // 创建外键关系
      for (const foreignKeySQL of this.FOREIGN_KEY_DEFINITIONS) {
        try {
          await connection.query(foreignKeySQL);
        } catch (error) {
          // 外键可能已存在，记录但不终止进程
          console.warn(`创建外键关系时出现警告: ${(error as Error).message}`);
        }
      }
      
      console.log('系统数据库初始化完成');
    } catch (error) {
      console.error('系统数据库初始化失败:', error);
      throw error;
    } finally {
      await connection.end();
    }
  }
  
  /**
   * 检查系统数据库连接
   * 验证数据库连接是否正常
   */
  public static async checkConnection(): Promise<boolean> {
    console.log('检查系统数据库连接...');
    
    try {
      const connection = await mysql.createConnection({
        host: DbConfig.host,
        port: DbConfig.port,
        user: DbConfig.adminUser,
        password: DbConfig.adminPassword,
        database: DbConfig.database
      });
      
      await connection.query('SELECT 1');
      await connection.end();
      
      console.log('系统数据库连接正常');
      return true;
    } catch (error) {
      console.error('系统数据库连接失败:', error);
      return false;
    }
  }

  /**
   * 执行初始化默认数据
   * 系统初始化时的基础数据填充
   */
  public static async initDefaultData(): Promise<void> {
    console.log('开始初始化系统默认数据结构...');
    
    const connection = await mysql.createConnection({
      host: DbConfig.host,
      port: DbConfig.port,
      user: DbConfig.adminUser,
      password: DbConfig.adminPassword,
      database: DbConfig.database
    });
    
    try {
      // 检查是否已存在默认数据
      const [workspaceRows] = await connection.query('SELECT COUNT(*) as count FROM workspaces');
      
      // 系统无需初始化默认用户，因为已实现首次注册用户自动成为管理员的功能
      // 确保类型安全地访问count属性
      const countResult = Array.isArray(workspaceRows) && workspaceRows.length > 0 ? workspaceRows[0] : null;
      const count = countResult && typeof countResult === 'object' && 'count' in countResult ? Number(countResult.count) : 0;
      
      if (count === 0) {
        console.log('系统表结构已初始化，无需创建默认数据');
        console.log('首次注册的用户将自动成为系统管理员');
      } else {
        console.log('系统已存在数据，跳过默认数据初始化');
      }
    } catch (error) {
      console.error('初始化系统默认数据失败:', error);
      throw error;
    } finally {
      await connection.end();
    }
  }
}
