<?php
// includes/core/Database.php

require_once __DIR__ . '/ErrorLogger.php';

/**
 * Singleton-Klasse zur Verwaltung der PDO-Datenbankverbindung
 */
class Database {
    private static $instance = null;
    private $pdo;

    // Gibt an, ob erfolgreiche SQL-Befehle geloggt werden sollen
    private static $logSuccessQueries = true;

    /**
     * Konstruktor – stellt eine PDO-Verbindung her
     */
    private function __construct($config) {
        try {
            $dsn = "mysql:host={$config['host']};dbname={$config['name']};charset={$config['charset']}";
            $this->pdo = new PDO($dsn, $config['user'], $config['pass'], [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
            ]);
        } catch (PDOException $e) {
            // Logge Verbindungsfehler auf FATAL-Level
            ErrorLogger::log("Datenbankverbindung fehlgeschlagen: " . $e->getMessage(), 'FATAL');
            throw $e;
        }
    }

    /**
     * Gibt die Singleton-Instanz zurück
     */
    public static function getInstance() {
        if (self::$instance === null) {
            $configFile = __DIR__ . '/../config.php';
            if (!file_exists($configFile)) {
                ErrorLogger::log("Konfigurationsdatei nicht gefunden: $configFile", 'FATAL');
                throw new Exception("Konfigurationsdatei nicht gefunden.");
            }

            $config = include $configFile;
            if (!isset($config['db'])) {
                ErrorLogger::log("Datenbank-Konfiguration fehlt in config.php", 'FATAL');
                throw new Exception("Datenbank-Konfiguration fehlt.");
            }

            self::$instance = new self($config['db']);
        }

        return self::$instance->pdo;
    }

    /**
     * Führt ein vorbereitetes SQL-Statement mit Logging aus
     */
    public static function query($sql, $params = []) {
        try {
            $pdo = self::getInstance();
            $stmt = $pdo->prepare($sql);
            $stmt->execute($params);

            // Erfolgreiche Abfrage loggen (wenn aktiviert)
            if (self::$logSuccessQueries) {
                ErrorLogger::logSqlSuccess("SQL erfolgreich: $sql | Parameter: " . json_encode($params));
            }

            return $stmt;
        } catch (PDOException $e) {
            // SQL-Fehler loggen
            ErrorLogger::logSqlError("SQL-Fehler: " . $e->getMessage() . " | SQL: $sql | Parameter: " . json_encode($params));
            throw $e;
        }
    }

    /**
     * Deaktiviert das Logging erfolgreicher SQL-Befehle
     */
    public static function disableQueryLogging() {
        self::$logSuccessQueries = false;
    }

    /**
     * Aktiviert das Logging erfolgreicher SQL-Befehle
     */
    public static function enableQueryLogging() {
        self::$logSuccessQueries = true;
    }
}
