import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from '@prisma/client';
import { Pool } from 'pg';
import {
  appEnvironment,
  databaseConnectionTimeoutMs,
  databaseIdleTimeoutMs,
  databasePoolMax,
  databasePoolMin,
  isProductionEnvironment,
  normalizedDatabaseUrl,
} from './env';

const isLocalhostDb = normalizedDatabaseUrl.includes('localhost') || normalizedDatabaseUrl.includes('127.0.0.1');

const pool = new Pool({
  ...(normalizedDatabaseUrl ? { connectionString: normalizedDatabaseUrl } : {}),
  max: databasePoolMax,
  min: databasePoolMin,
  connectionTimeoutMillis: databaseConnectionTimeoutMs,
  idleTimeoutMillis: databaseIdleTimeoutMs,
  ssl: isProductionEnvironment && !isLocalhostDb ? { rejectUnauthorized: false } : false,
});

const adapter = new PrismaPg(pool);

const prisma = new PrismaClient({
  adapter,
  log: appEnvironment === 'test' ? [] : ['query', 'info', 'warn', 'error'],
});

export const checkDatabaseConnection = async () => {
  if (!normalizedDatabaseUrl) {
    return {
      ok: false as const,
      error: 'DATABASE_URL no configurada.',
    };
  }

  try {
    await prisma.$queryRawUnsafe('SELECT 1');
    return {
      ok: true as const,
      error: null,
    };
  } catch (error) {
    return {
      ok: false as const,
      error: error instanceof Error ? error.message : 'Database connection failed',
    };
  }
};

export const closeDatabaseConnections = async () => {
  await prisma.$disconnect();
  await pool.end();
};

export default prisma;
