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

let pool: Pool | null = null;

export const initDb = (config: AppConfig): Pool => {
  if (pool) {
    return pool;
  }

  const ssl = config.db.ssl
    ? {
        rejectUnauthorized: config.db.sslRejectUnauthorized,
        ca: config.db.sslCa,
      }
    : undefined;

  pool = mysql.createPool({
    host: config.db.host,
    port: config.db.port,
    user: config.db.user,
    password: config.db.password,
    database: config.db.name,
    waitForConnections: true,
    connectionLimit: config.db.poolSize,
    queueLimit: 0,
    ssl,
  });

  return pool;
};

export const getDb = (): Pool => {
  if (!pool) {
    throw new Error("Database not initialized");
  }
  return pool;
};

export const pingDb = async (): Promise<void> => {
  const db = getDb();
  await db.query("SELECT 1");
};

export const closeDb = async (): Promise<void> => {
  if (!pool) {
    return;
  }
  const current = pool;
  pool = null;
  await current.end();
};
