import mysql, { type Pool } from "mysql2/promise";
import { env } from "../config/env.js";

/**
 * Pool de conexões MySQL (mysql2/promise) compartilhado pela API e pelos
 * workers.
 *
 * Decisões importantes (CLAUDE.md):
 * - `utf8mb4` em tudo.
 * - Valores `DECIMAL(24,8)` (monetários) chegam como STRING, nunca float —
 *   `decimalNumbers: false`. Converta com cuidado na camada de domínio.
 * - `timezone: 'Z'`: timestamps tratados em UTC (o schema usa +00:00).
 * - `namedPlaceholders`: permite `:param` nas queries.
 */

export const pool: Pool = mysql.createPool({
  host: env.DB_HOST,
  port: env.DB_PORT,
  user: env.DB_USER,
  password: env.DB_PASSWORD,
  database: env.DB_NAME,
  charset: "utf8mb4",
  timezone: "Z",
  decimalNumbers: false,
  supportBigNumbers: true,
  bigNumberStrings: true,
  namedPlaceholders: true,
  waitForConnections: true,
  connectionLimit: 10,
  maxIdle: 10,
  enableKeepAlive: true,
});

/** Health-check: `SELECT 1`. Lança se o banco estiver inacessível. */
export async function ping(): Promise<void> {
  const conn = await pool.getConnection();
  try {
    await conn.query("SELECT 1");
  } finally {
    conn.release();
  }
}

/** Encerra o pool (graceful shutdown dos processos). */
export async function closePool(): Promise<void> {
  await pool.end();
}
