<?php

namespace App\Services;

use App\Core\Database;
use App\Repositories\TabelasRepository;

/**
 * Lê e interpreta a estrutura do banco Firebird conectado.
 */
class TabelasService
{
    private TabelasRepository $repo;

    public function __construct()
    {
        $pdo        = Database::conectar();
        $this->repo = new TabelasRepository($pdo);
    }

    // -------------------------------------------------------------------------
    // Listagem
    // -------------------------------------------------------------------------

    /**
     * Retorna lista de tabelas com contagem de colunas.
     *
     * @return array<array{nome: string, total_colunas: int}>
     */
    public function listarTabelas(): array
    {
        $tabelas = $this->repo->listarTabelas();

        return array_map(function (array $t): array {
            $colunas = $this->repo->colunas($t['nome']);
            return [
                'nome'          => $t['nome'],
                'total_colunas' => count($colunas),
            ];
        }, $tabelas);
    }

    // -------------------------------------------------------------------------
    // Detalhes de uma tabela
    // -------------------------------------------------------------------------

    /**
     * Retorna colunas tipadas + contagem de registros de uma tabela.
     *
     * @return array{colunas: array, total_registros: int}
     */
    public function detalheTabela(string $tabela): array
    {
        $bruto = $this->repo->colunas($tabela);

        $colunas = array_map(function (array $col): array {
            return [
                'campo'        => trim($col['campo']),
                'tipo'         => $this->nomeTipo((int) $col['tipo_cod'], (int) $col['sub_tipo']),
                'tamanho'      => (int) $col['tamanho'],
                'precisao'     => (int) $col['precisao'],
                'escala'       => (int) $col['escala'],
                'permite_nulo' => (bool) $col['permite_nulo'],
                'padrao'       => $col['valor_padrao'],
            ];
        }, $bruto);

        return [
            'colunas'          => $colunas,
            'total_registros'  => $this->repo->contarRegistros($tabela),
        ];
    }

    // -------------------------------------------------------------------------
    // Preview de dados
    // -------------------------------------------------------------------------

    public function preview(string $tabela, int $limite = 10): array
    {
        return $this->repo->primeirasLinhas($tabela, $limite);
    }

    // -------------------------------------------------------------------------
    // Mapeamento de tipos Firebird
    // -------------------------------------------------------------------------

    /**
     * Converte o código numérico de tipo Firebird em nome legível.
     */
    private function nomeTipo(int $codigo, int $subTipo): string
    {
        return match ($codigo) {
            7   => 'SMALLINT',
            8   => 'INTEGER',
            10  => 'FLOAT',
            12  => 'DATE',
            13  => 'TIME',
            14  => 'CHAR',
            16  => $subTipo === 1 ? 'NUMERIC' : ($subTipo === 2 ? 'DECIMAL' : 'BIGINT'),
            23  => 'BOOLEAN',
            27  => 'DOUBLE PRECISION',
            35  => 'TIMESTAMP',
            37  => 'VARCHAR',
            261 => $subTipo === 1 ? 'BLOB TEXT' : 'BLOB',
            default => "TIPO({$codigo})",
        };
    }
}
