<?php

namespace App\Services;

/**
 * Lê, valida e persiste a configuração do banco de dados.
 * O arquivo gerado fica fora da pasta pública e não deve ser commitado.
 */
class ConfigService
{
    private string $configPath;

    public function __construct()
    {
        $this->configPath = dirname(__DIR__, 2) . '/config/database.php';
    }

    // -------------------------------------------------------------------------
    // Leitura
    // -------------------------------------------------------------------------

    /**
     * Retorna a configuração salva ou um array com valores padrão.
     */
    public function carregar(): array
    {
        if (file_exists($this->configPath)) {
            $dados = require $this->configPath;
            if (is_array($dados)) {
                return $dados;
            }
        }

        return $this->padroes();
    }

    // -------------------------------------------------------------------------
    // Validação
    // -------------------------------------------------------------------------

    /**
     * Valida os dados do formulário.
     *
     * @return array<string, string> Mapa campo => mensagem de erro (vazio = sem erros)
     */
    public function validar(array $dados): array
    {
        $erros = [];

        if (empty(trim($dados['empresa'] ?? ''))) {
            $erros['empresa'] = 'Nome da empresa é obrigatório.';
        }

        if (empty($dados['segmento'])) {
            $erros['segmento'] = 'Selecione o segmento da empresa.';
        }

        if (!empty($dados['tipo']) && $dados['tipo'] === 'remota') {
            if (empty(trim($dados['host'] ?? ''))) {
                $erros['host'] = 'Host/IP é obrigatório para conexão remota.';
            }
        }

        $porta = (int) ($dados['porta'] ?? 0);
        if ($porta < 1 || $porta > 65535) {
            $erros['porta'] = 'Porta inválida (1–65535).';
        }

        if (empty(trim($dados['database'] ?? ''))) {
            $erros['database'] = 'Caminho do banco .FDB é obrigatório.';
        }

        if (empty(trim($dados['usuario'] ?? ''))) {
            $erros['usuario'] = 'Usuário é obrigatório.';
        }

        if (empty($dados['senha'] ?? '')) {
            // Aceita senha vazia somente se já existia uma configuração salva
            $atual = $this->carregar();
            if (empty($atual['password'])) {
                $erros['senha'] = 'Senha é obrigatória.';
            }
        }

        return $erros;
    }

    // -------------------------------------------------------------------------
    // Persistência
    // -------------------------------------------------------------------------

    /**
     * Salva a configuração em config/database.php.
     * Se a senha vier vazia, mantém a senha anterior.
     */
    public function salvar(array $dados): void
    {
        $atual = $this->carregar();

        $temasValidos = [
            // 6 temas premium (v1.4.8)
            'aurora','mastersoft-pro','carbon','onyx','forest','slate',
            // legados — preservados pra compat (resolvem via alias no main.php)
            'claro','mastersoft','grafite',
            'escuro','meia_noite','escuro_roxo',
            'oceano','marinho','ceu',
            'floresta','teal',
            'ametista','indigo','rosa',
            'carvao','dourado','carmim',
        ];
        $tema = in_array($dados['tema'] ?? '', $temasValidos) ? $dados['tema'] : 'aurora';

        $codEmpresa = isset($dados['cod_empresa']) && $dados['cod_empresa'] !== ''
            ? (int) $dados['cod_empresa']
            : null;

        $config = [
            'empresa'     => trim($dados['empresa']   ?? ''),
            'segmento'    => trim($dados['segmento']  ?? ''),
            'tema'        => $tema,
            'cod_empresa' => $codEmpresa,
            'tipo'        => $dados['tipo'] === 'local' ? 'local' : 'remota',
            'host'        => trim($dados['host']      ?? 'localhost'),
            'port'        => (int) ($dados['porta']   ?? 3050),
            'database'    => trim($dados['database']  ?? ''),
            'username'    => trim($dados['usuario']   ?? 'SYSDBA'),
            'charset'     => trim($dados['charset']   ?? 'UTF8'),
            // Mantém senha anterior se o campo vier vazio (edição sem revelar senha)
            'password'    => !empty($dados['senha'])
                             ? $dados['senha']
                             : ($atual['password'] ?? ''),
        ];

        $this->escreverArquivo($config);
    }

    // -------------------------------------------------------------------------
    // Internos
    // -------------------------------------------------------------------------

    /**
     * Atualiza apenas o tema, preservando todo o resto da config.
     */
    public function salvarTema(string $tema): void
    {
        $temasValidos = [
            // 6 temas premium (v1.4.8)
            'aurora','mastersoft-pro','carbon','onyx','forest','slate',
            // legados — preservados pra compat (resolvem via alias no main.php)
            'claro','mastersoft','grafite',
            'escuro','meia_noite','escuro_roxo',
            'oceano','marinho','ceu',
            'floresta','teal',
            'ametista','indigo','rosa',
            'carvao','dourado','carmim',
        ];
        if (!in_array($tema, $temasValidos)) $tema = 'aurora';

        $config = $this->carregar();
        $config['tema'] = $tema;
        $this->escreverArquivo($config);
    }

    private function escreverArquivo(array $config): void
    {
        $conteudo  = "<?php\n";
        $conteudo .= "// Configuração gerada automaticamente pelo Premium Express Gestão\n";
        $conteudo .= "// NÃO commitar este arquivo — adicionar ao .gitignore\n";
        $conteudo .= "return " . var_export($config, true) . ";\n";

        if (file_put_contents($this->configPath, $conteudo) === false) {
            throw new \RuntimeException('Não foi possível gravar config/database.php. Verifique as permissões.');
        }
    }

    private function padroes(): array
    {
        return [
            'empresa'     => '',
            'segmento'    => '',
            'tema'        => 'aurora',
            'cod_empresa' => null,
            'tipo'        => 'remota',
            'host'        => 'localhost',
            'port'        => 3050,
            'database'    => '',
            'username'    => 'SYSDBA',
            'charset'     => 'UTF8',
            'password'    => '',
        ];
    }
}
