<?php
declare(strict_types=1);

function db(): PDO
{
    static $pdo = null;
    if ($pdo instanceof PDO) {
        return $pdo;
    }

    $config = app_config('db');
    $dsn = sprintf(
        'mysql:host=%s;port=%d;dbname=%s;charset=%s',
        $config['host'],
        $config['port'],
        $config['name'],
        $config['charset'] ?? 'utf8mb4'
    );

    $pdo = new PDO($dsn, $config['user'], $config['pass'], [
        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",
    ]);

    return $pdo;
}

function db_table_exists(string $table): bool
{
    if ($table === '' || preg_match('/^[A-Za-z0-9_]+$/', $table) !== 1) {
        return false;
    }

    try {
        // SHOW TABLES LIKE ? bazı MySQL/MariaDB sürümlerinde native prepared
        // statement ile güvenilir çalışmaz. information_schema sorgusu her ikisinde de çalışır.
        $stmt = db()->prepare(
            'SELECT 1
             FROM information_schema.tables
             WHERE table_schema = DATABASE() AND table_name = ?
             LIMIT 1'
        );
        $stmt->execute([$table]);
        return (bool) $stmt->fetchColumn();
    } catch (Throwable $e) {
        // information_schema yetkisi kısıtlı çok eski hostingler için güvenli yedek kontrol.
        try {
            $quoted = '`' . str_replace('`', '``', $table) . '`';
            db()->query('SELECT 1 FROM ' . $quoted . ' LIMIT 1');
            return true;
        } catch (Throwable) {
            return false;
        }
    }
}
