<?php
namespace App\Models;

use App\Core\Database;
use PDO;

class Settings
{
    private static function ensureTable(PDO $pdo): void
    {
        // Crée une table minimale si absente (n'ajoute pas de colonnes si elle existe déjà)
        try {
            $pdo->exec("CREATE TABLE IF NOT EXISTS settings (
                `key` VARCHAR(64) NOT NULL,
                `value` TEXT NULL,
                PRIMARY KEY (`key`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
        } catch (\Throwable $e) { /* ignore */ }
    }

    private static function detectColumns(PDO $pdo): array
    {
        // Détecte dynamiquement les colonnes clé/valeur selon le schéma courant
        $keyCol = 'key';
        $valCol = 'value';
        try {
            $cols = $pdo->query('DESCRIBE settings')->fetchAll(PDO::FETCH_COLUMN);
            if ($cols && is_array($cols)) {
                // Trouver colonne value
                foreach ($cols as $c) {
                    if (preg_match('~^(value|val|data|content|text)$~i', $c)) { $valCol = $c; break; }
                }
                // Trouver colonne key
                foreach ($cols as $c) {
                    if (preg_match('~^(key|name|code|param|setting|option)$~i', $c)) { $keyCol = $c; break; }
                }
            }
        } catch (\Throwable $e) { /* keep defaults */ }
        return [$keyCol, $valCol];
    }

    public static function get(string $key, $default = null)
    {
        $pdo = Database::pdo();
        self::ensureTable($pdo);
        [$keyCol, $valCol] = self::detectColumns($pdo);
        try {
            $stmt = $pdo->prepare("SELECT `{$valCol}` AS v FROM settings WHERE `{$keyCol}` = ? LIMIT 1");
            $stmt->execute([$key]);
            $row = $stmt->fetch(PDO::FETCH_ASSOC);
            return $row && array_key_exists('v', $row) ? $row['v'] : $default;
        } catch (\Throwable $e) {
            return $default;
        }
    }

    public static function set(string $key, string $value): void
    {
        $pdo = Database::pdo();
        self::ensureTable($pdo);
        [$keyCol, $valCol] = self::detectColumns($pdo);
        try {
            $sql = "REPLACE INTO settings(`{$keyCol}`,`{$valCol}`) VALUES(?,?)";
            $stmt = $pdo->prepare($sql);
            $stmt->execute([$key, $value]);
        } catch (\Throwable $e) { /* ignore write errors in dev */ }
    }
}
