<?php

namespace App\Core;

use App\Services\FirebirdService;

/**
 * Gerencia conexões PDO com o Firebird.
 *
 * - SINGLE-LOJA (sem config/lojas.php): conecta usando config/database.php (igual sempre).
 * - MULTI-LOJA  (com config/lojas.php): conecta na LOJA ATIVA (sessão); mantém uma
 *   conexão em cache por loja, e permite conectar numa loja específica (p/ consolidado).
 */
class Database
{
    /** Conexões em cache, indexadas por id de loja (ou '_single'). */
    private static array $instancias = [];

    // -------------------------------------------------------------------------
    // Conexão
    // -------------------------------------------------------------------------

    /**
     * Conexão da LOJA ATIVA (ou a única, em single-loja).
     *
     * @throws \RuntimeException Se a configuração não existir ou a conexão falhar
     */
    public static function conectar(): \PDO
    {
        $id = Lojas::idAtiva();              // null = single-loja
        return $id !== null
            ? self::conectarLoja($id)
            : self::conectarChave('_single', self::configSingle());
    }

    /**
     * Conexão de uma loja específica (multi-loja). Usado pela visão consolidada.
     *
     * @throws \RuntimeException Se a loja não existir
     */
    public static function conectarLoja(string $id): \PDO
    {
        $cfg = Lojas::configDe($id);
        if ($cfg === null) {
            throw new \RuntimeException("Loja '{$id}' não está configurada em config/lojas.php.");
        }
        return self::conectarChave($id, $cfg);
    }

    /** Conecta (ou reaproveita) usando uma chave de cache + config. */
    private static function conectarChave(string $chave, array $config): \PDO
    {
        if (isset(self::$instancias[$chave])) {
            // Verifica se a conexão ainda está viva (detecta -901 após restart do Firebird)
            try {
                self::$instancias[$chave]->query('SELECT 1 FROM RDB$DATABASE');
                return self::$instancias[$chave];
            } catch (\Throwable) {
                unset(self::$instancias[$chave]); // morta -> reconecta abaixo
            }
        }

        $service = new FirebirdService();
        return self::$instancias[$chave] = $service->criarConexao($config);
    }

    /** Config do modo single-loja (config/database.php). */
    private static function configSingle(): array
    {
        $configPath = dirname(__DIR__, 2) . '/config/database.php';
        if (!file_exists($configPath)) {
            throw new \RuntimeException(
                'Configuração não encontrada. Acesse /configurar para configurar o sistema.'
            );
        }
        return require $configPath;
    }

    // -------------------------------------------------------------------------
    // Utilitários
    // -------------------------------------------------------------------------

    /**
     * Verifica se o sistema está configurado
     * (existe lojas.php com lojas, OU config/database.php).
     */
    public static function estaConfigurado(): bool
    {
        return Lojas::multi()
            || file_exists(dirname(__DIR__, 2) . '/config/database.php');
    }

    /**
     * Tenta conectar e retorna [success, mensagem].
     *
     * @return array{success: bool, mensagem: string}
     */
    public static function verificar(): array
    {
        try {
            self::conectar();
            return ['success' => true, 'mensagem' => 'Conexão ativa'];
        } catch (\Throwable $e) {
            return ['success' => false, 'mensagem' => $e->getMessage()];
        }
    }

    /** Reseta as instâncias (útil em testes / troca de loja). */
    public static function resetar(): void
    {
        self::$instancias = [];
    }
}
