<?php

namespace App\Core;

use PDO;
use PDOException;

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

    private function __construct(array $config)
    {
        $dsn = 'mysql:host=' . $config['host'] .
            ';port=' . $config['port'] .
            ';dbname=' . $config['name'] .
            ';charset=' . $config['charset'];

        try {
            $options = [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_PERSISTENT => false,
                PDO::ATTR_EMULATE_PREPARES => false
            ];
            
            // إضافة ATTR_TIMEOUT فقط إذا كان مدعوماً
            if (defined('PDO::ATTR_TIMEOUT')) {
                $options[PDO::ATTR_TIMEOUT] = 5;
            }
            
            $this->pdo = new PDO($dsn, $config['user'], $config['pass'], $options);
        } catch (PDOException $e) {
            // رمي الاستثناء بدلاً من الإنهاء المباشر حتى يتمكن ErrorHandler من تسجيله
            throw new \RuntimeException(
                'فشل الاتصال بقاعدة البيانات: ' . $e->getMessage(),
                0,
                $e
            );
        }
    }

    public static function getInstance(array $config): Database
    {
        if (self::$instance === null) {
            self::$instance = new Database($config);
        }

        return self::$instance;
    }

    public function connection(): PDO
    {
        return $this->pdo;
    }
}
