<?php
declare(strict_types=1);

/**
 * /includes/db.php
 * - PDO підключення до MySQL
 * - Примусово utf8mb4 для емодзі
 * - Підтримка port / unix_socket (на випадок різних хостингів)
 */

require_once __DIR__ . '/config.php';

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

    $cfg = app_config();
    $db  = $cfg['db'] ?? [];

    $host   = trim((string)($db['host'] ?? '127.0.0.1'));
    $name   = trim((string)($db['name'] ?? ''));
    $user   = trim((string)($db['user'] ?? ''));
    $pass   = (string)($db['pass'] ?? '');
    $port   = (int)($db['port'] ?? 0);
    $socket = trim((string)($db['socket'] ?? ''));

    if ($name === '' || $user === '') {
        // Безпечне повідомлення без деталей
        throw new RuntimeException('DB config error: missing db.name or db.user');
    }

    // ✅ гарантуємо utf8mb4 навіть якщо в config випадково стоїть utf8
    $charset = (string)($db['charset'] ?? 'utf8mb4');
    if ($charset === '' || strtolower($charset) === 'utf8') {
        $charset = 'utf8mb4';
    }

    // DSN: socket має пріоритет (якщо заданий)
    if ($socket !== '') {
        $dsn = sprintf(
            'mysql:unix_socket=%s;dbname=%s;charset=%s',
            $socket,
            $name,
            $charset
        );
    } else {
        // host + optional port
        $dsn = sprintf(
            'mysql:host=%s;%sdbname=%s;charset=%s',
            $host,
            ($port > 0 ? ('port=' . $port . ';') : ''),
            $name,
            $charset
        );
    }

    try {
        $pdo = new PDO($dsn, $user, $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",
        ]);
    } catch (Throwable $e) {
        // Не показуємо DSN/логін/пароль у помилці
        error_log('DB connect error: ' . $e->getMessage());
        throw new RuntimeException('DB connection failed');
    }

    return $pdo;
}