<?php
namespace Misuzu;

use PDO;
use Misuzu\Database\Database;

/**
 * @method static PDO getPDO()
 * @method static int queries()
 * @method static int exec(string $stmt)
 * @method static \Misuzu\Database\DatabaseStatement prepare(string $stmt, array $options = [])
 * @method static \Misuzu\Database\DatabaseStatement query(string $stmt, ?int $fetchMode = null, ...$args)
 * @method static int lastId()
 */
final class DB {
    private static $instance;

    public const PREFIX = 'msz_';

    public const ATTRS = [
        PDO::ATTR_CASE => PDO::CASE_NATURAL,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
        PDO::ATTR_STRINGIFY_FETCHES => false,
        PDO::ATTR_EMULATE_PREPARES => false,
    ];

    public static function init(...$args) {
        self::$instance = new Database(...$args);
    }

    public static function __callStatic(string $name, array $args) {
        return self::$instance->{$name}(...$args);
    }

    public static function getInstance(): Database {
        return self::$instance;
    }

    public static function buildDSN(array $vars): string {
        $dsn = ($vars['driver'] ?? 'mysql') . ':';

        foreach($vars as $key => $value) {
            if($key === 'driver' || $key === 'username' || $key === 'password')
                continue;
            if($key === 'database')
                $key = 'dbname';

            $dsn .= $key . '=' . $value . ';';
        }

        return $dsn;
    }
}
