import { Pool } from 'pg';

import { config, sslOptionFromMode } from './config.js';

export const db = new Pool({
  host: config.database.host,
  port: config.database.port,
  database: config.database.name,
  user: config.database.user,
  password: config.database.password,
  ssl: sslOptionFromMode(config.database.ssl),
  max: 10,
  idleTimeoutMillis: 30_000,
  connectionTimeoutMillis: 5_000,
});

db.on('error', () => {
  console.error('An idle PostgreSQL connection failed unexpectedly.');
});

// ✅ Segunda ligacao, opcional, usada so para replicar escritas da
// kv_store_7249dcd9 numa base remota (ex: PostgreSQL alojado num cPanel) -
// ver backend/src/repositories/kv-store.ts. Só é criada quando
// config.syncRemote.enabled é true (todas as credenciais remotas
// presentes); caso contrário fica `null` e a sincronização é
// completamente ignorada, sem qualquer ligação de rede extra.
export const dbRemote: Pool | null = config.syncRemote.enabled
  ? new Pool({
      host: config.syncRemote.host,
      port: config.syncRemote.port,
      database: config.syncRemote.name,
      user: config.syncRemote.user,
      password: config.syncRemote.password,
      ssl: sslOptionFromMode(config.syncRemote.ssl),
      max: 5,
      idleTimeoutMillis: 30_000,
      connectionTimeoutMillis: 5_000,
    })
  : null;

if (dbRemote) {
  dbRemote.on('error', () => {
    // ✅ Uma falha na ligacao remota nunca pode derrubar o processo - o
    // trabalho local tem de continuar a funcionar normalmente mesmo que o
    // cPanel esteja em baixo ou inacessivel.
    console.error('An idle remote (sync) PostgreSQL connection failed unexpectedly.');
  });
}

export async function checkDatabaseConnection(): Promise<void> {
  const result = await db.query<{ ok: number }>('SELECT 1 AS ok');

  if (result.rows[0]?.ok !== 1) {
    throw new Error('PostgreSQL health check returned an unexpected result.');
  }
}

export async function closeDatabase(): Promise<void> {
  await db.end();
  if (dbRemote) {
    await dbRemote.end();
  }
}
