<?php

// Polyfill para str_starts_with (para PHP < 8.0)
if (!function_exists('str_starts_with')) {
    function str_starts_with($haystack, $needle) {
        return substr($haystack, 0, strlen($needle)) === $needle;
    }
}

if (!function_exists('carregarEnv')) { // Boa prática: verificar se a função já não foi definida
    /**
     * Carrega variáveis de ambiente de um arquivo .env.
     *
     * @param string $caminho O caminho para o arquivo .env.
     * @throws Exception Se o arquivo .env não for encontrado.
     */
    function carregarEnv($caminho)
    {
        if (!file_exists($caminho)) {
            // Lançar uma exceção é uma boa abordagem para um arquivo de configuração crítico.
            throw new Exception("Arquivo .env não encontrado em: " . $caminho);
        }

        $linhas = file($caminho, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

        foreach ($linhas as $linha) {
            // Remove espaços em branco do início e fim da linha
            $linhaLimpa = trim($linha);

            // Ignora linhas vazias ou que são comentários (iniciadas com #)
            if ($linhaLimpa === '' || str_starts_with($linhaLimpa, '#')) {
                continue;
            }

            // Verifica se a linha contém o caractere '='. Se não, não é uma definição válida.
            if (strpos($linhaLimpa, '=') === false) {
                // Opcional: você poderia logar um aviso para linhas malformadas
                // error_log("Linha malformada no arquivo .env ignorada: " . $linhaLimpa);
                continue;
            }

            // Divide a linha em chave e valor
            // O '2' como limite garante que se o valor contiver '=', ele não será quebrado novamente.
            list($chave, $valor) = explode('=', $linhaLimpa, 2);

            $chave = trim($chave);
            $valor = trim($valor);

            // Remove aspas (simples ou duplas) do início e fim do valor, se presentes
            // Ex: DB_PASS="minhasenha" se tornará minhasenha
            // Ex: DB_PASS='minhasenha' se tornará minhasenha
            if (preg_match('/^(\'(.*)\'|"(.*)")$/m', $valor, $matches)) {
                // Se encontrou aspas simples, $matches[2] terá o valor.
                // Se encontrou aspas duplas, $matches[3] terá o valor.
                $valor = isset($matches[2]) && $matches[2] !== '' ? $matches[2] : (isset($matches[3]) ? $matches[3] : '');
            }
            
            // Expansão de variáveis simples (opcional, mas útil)
            // Ex: MY_OTHER_VAR=${MY_VAR}/path
            if (strpos($valor, '${') !== false) {
                $valor = preg_replace_callback(
                    '/\$\{([A-Za-z0-9_]+)\}/',
                    function ($matches) {
                        $variavelInterna = $matches[1];
                        return $_ENV[$variavelInterna] ?? (getenv($variavelInterna) ?: ''); // Busca em $_ENV e getenv
                    },
                    $valor
                );
            }


            // Define a variável de ambiente se ela ainda não existir (para não sobrescrever vars do servidor)
            // Popula $_ENV, $_SERVER e usa putenv() para maior compatibilidade.
            if (!array_key_exists($chave, $_SERVER) && !array_key_exists($chave, $_ENV)) {
                putenv(sprintf('%s=%s', $chave, $valor)); // Torna disponível para getenv()
                $_ENV[$chave] = $valor;                    // Popula o superglobal $_ENV
                $_SERVER[$chave] = $valor;                 // Popula o superglobal $_SERVER (por conveniência)
            }
        }
    }
}