<?php
/**
 * TechShop Perú - Conexión a Base de Datos (PDO)
 * 
 * Proporciona una conexión PDO singleton a MySQL.
 * 
 * @package TechShop Perú
 * @version 1.0
 */

// Prevenir acceso directo
if (!defined('SECURE_ACCESS')) {
    die('Acceso directo no permitido');
}

class Database
{
    private static ?PDO $instance = null;

    /**
     * Obtiene la instancia única de conexión PDO.
     * 
     * @return PDO
     * @throws PDOException Si falla la conexión
     */
    public static function getConnection(): PDO
    {
        if (self::$instance === null) {
            try {
                $dsn = sprintf(
                    'mysql:host=%s;dbname=%s;charset=%s',
                    DB_HOST,
                    DB_NAME,
                    DB_CHARSET
                );

                $options = [
                    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE  => PDO::FETCH_ASSOC,
                    PDO::ATTR_EMULATE_PREPARES    => false,
                    PDO::MYSQL_ATTR_INIT_COMMAND  => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci",
                    PDO::ATTR_PERSISTENT          => false,
                ];

                self::$instance = new PDO($dsn, DB_USER, DB_PASS, $options);
            } catch (PDOException $e) {
                $message = 'Error de conexión a la base de datos. Verifica DB_HOST, DB_NAME, DB_USER y DB_PASS. En cPanel debes usar el usuario creado para la base de datos, no root. Detalle: ' . $e->getMessage();

                if (DEBUG_MODE) {
                    die($message);
                }

                error_log($message);
                die('Error de conexión a la base de datos. Por favor, intente más tarde.');
            }
        }

        return self::$instance;
    }

    /**
     * Previene la clonación de la instancia (singleton).
     */
    private function __clone() {}

    /**
     * Cierra la conexión (útil para pruebas).
     */
    public static function close(): void
    {
        self::$instance = null;
    }
}

/**
 * Helper: obtiene la conexión PDO directamente.
 * Uso: $db = db();
 * 
 * @return PDO
 */
function db(): PDO
{
    return Database::getConnection();
}
