<?php

// Establece coneccion a base de datos (Singleton) usando el motor pgsql (postgreSQL) mediante la interfaz PDO

class Database {

    // Conección única reutilizable

    private static $connection = null;

    public static function getConnection() {

        // Si ya existe una conexión activa, se reutiliza

        if (self::$connection !== null) {
            return self::$connection;
        }

        // Obtiene credenciales desde variables de entorno, se definen valores por defecto en caso de que no existan

        $host = $_ENV['DB_HOST'] ?? 'db';
        $port = $_ENV['DB_PORT'] ?? '5432';
        $db = $_ENV['DB_NAME'] ?? 'bytecenter';
        $user = $_ENV['DB_USER'] ?? 'admin';
        $pass = $_ENV['DB_PASSWORD'] ?? 'admin_bytepassword';

        // DSN (Data Source Name):
        // Define el tipo de base de datos (pgsql) y los parámetros de conexión
        // Es la "cadena de conexión" que PDO necesita para saber a dónde conectarse

        $dsn = "pgsql:host=$host;port=$port;dbname=$db";

        try {

            // Se crea la instancia de PDO (conección a la BD)

            self::$connection = new PDO($dsn, $user, $pass, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            ]);

            return self::$connection; // Retorna la conección lista para usar

        } catch (PDOException $e) {

            // Log interno

            error_log($e->getMessage());

            // Muestra mensaje amigable

            die("Ocurrió un error inesperado. Por favor, comuníquese con un administrador o intente denuevo mas tarde.");

            // Mensaje para desarrollo -->

            // die("Error de conexión a la base de datos: " . $e->getMessage());
        }
    }
}