<?php
/// file: app/Core/Database.php

declare(strict_types=1);

namespace App\Core;

use PDO;
use PDOException;

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

    public static function connect(array $config): PDO
    {
        if (self::$pdo instanceof PDO) {
            return self::$pdo;
        }
        $host = $config['host'] ?? '127.0.0.1';
        $port = (int) ($config['port'] ?? 3306);
        $name = trim((string) ($config['database'] ?? ''));
        if ($name === '') {
            throw new \RuntimeException(
                'Veritabanı adı (DB_NAME) boş. Proje kökünde .env dosyası oluşturun: cp .env.example .env — ardından DB_NAME, DB_USER, DB_PASS değerlerini doldurun ve php migrate.php && php seed.php çalıştırın.'
            );
        }
        $user = $config['username'] ?? 'root';
        $pass = $config['password'] ?? '';
        $charset = $config['charset'] ?? 'utf8mb4';
        $dsn = "mysql:host={$host};port={$port};dbname={$name};charset={$charset}";
        try {
            self::$pdo = new PDO($dsn, $user, $pass, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            ]);
        } catch (PDOException $e) {
            throw new PDOException('Database connection failed: ' . $e->getMessage(), (int) $e->getCode());
        }
        return self::$pdo;
    }

    public static function pdo(): PDO
    {
        if (self::$pdo instanceof PDO) {
            return self::$pdo;
        }
        $config = Config::get('database.connections.mysql', []);
        if (! is_array($config)) {
            throw new \RuntimeException(
                'Veritabanı yapılandırması bulunamadı. config/database.php ve .env dosyasını kontrol edin.'
            );
        }
        return self::connect($config);
    }
}
