import { drizzle, type MySql2Database } from "drizzle-orm/mysql2";
import mysql from "mysql2/promise";
import { env } from "./env.js";

/**
 * msg 服务 MySQL 连接池。
 *
 * 仲裁依据 G10：统一 getDb() 函数式（对齐 classes 黄金模板）。
 *
 * 使用 lazy initialization：pool 在首次调用 getDb() 时创建，
 * 避免模块导入副作用导致测试环境难以 mock。
 */
let pool: mysql.Pool | null = null;
let dbInstance: MySql2Database<Record<string, never>> | null = null;

function getPool(): mysql.Pool {
  if (!pool) {
    pool = mysql.createPool({
      uri: env.DATABASE_URL,
      waitForConnections: true,
      connectionLimit: 10,
      queueLimit: 0,
    });
  }
  return pool;
}

export function getDb(): MySql2Database<Record<string, never>> {
  if (!dbInstance) {
    dbInstance = drizzle(getPool());
  }
  return dbInstance;
}

export async function closeDb(): Promise<void> {
  if (pool) {
    await pool.end();
    pool = null;
    dbInstance = null;
  }
}

/**
 * 健康检查用：直接访问底层 pool。
 */
export function getPoolInstance(): mysql.Pool {
  return getPool();
}
