<?php
declare(strict_types=1);

namespace Celena\Core\Database\Driver;

final class PgsqlDriver implements DriverInterface
{
    public function name(): string { return 'pgsql'; }

    public function dsn(array $config): string
    {
        $host = $config['host'] ?? '127.0.0.1';
        $port = $config['port'] ?? 5432;
        $name = $config['name'] ?? '';
        return "pgsql:host=$host;port=$port;dbname=$name";
    }

    public function quoteId(string $id): string
    {
        // PG использует двойные кавычки. Для дотов (table.col) — каждый сегмент.
        return implode('.', array_map(fn ($p) => '"' . str_replace('"', '""', $p) . '"', explode('.', $id)));
    }

    public function mapType(string $abstract, array $opts = []): string
    {
        return match ($abstract) {
            'id'        => 'BIGSERIAL PRIMARY KEY',
            'string'    => 'VARCHAR(' . ($opts['length'] ?? 255) . ')',
            'text'      => 'TEXT',
            'integer'   => 'INTEGER',
            'bigInteger'=> 'BIGINT',
            'boolean'   => 'BOOLEAN',
            'json'      => 'JSONB',
            'datetime'  => 'TIMESTAMP',
            'date'      => 'DATE',
            'float'     => 'DOUBLE PRECISION',
            'decimal'   => 'NUMERIC(' . ($opts['precision'] ?? 10) . ',' . ($opts['scale'] ?? 2) . ')',
            'binary'    => 'BYTEA',
            default     => strtoupper($abstract),
        };
    }

    public function supportsReturning(): bool { return true; }

    public function lastInsertSeq(string $table, string $column = 'id'): ?string
    {
        // PG автоматически создаёт sequence: "<table>_<column>_seq"
        return $table . '_' . $column . '_seq';
    }
}
