<?php

class Agro_Essor_Plug_Enderecos
{
    /**
     * Consulta o PLUG para retornar os dados de endereço a partir do CEP informado
     * Rota: {Versao}/enderecos/{cpfCnpj}
     *
     * @param string $cep
     * @return array
     */
    public static function cep(string $cep): array
    {
        $cep = preg_replace('/[.\-\/\s]/', '', $cep);
        $url = PLUG_URL ."/" . PLUG_VERSION . "/enderecos/{$cep}";
        return self::execute($url);
    }

    /**
     * Consulta o PLUG para retornar os dados de endereço a partir da UF, localidade(municipio) e/ou logradouro.
     * Rota: {Versao}/enderecos?uf={uf}&logradouro={logradouro}&localidade={localidade}
     *
     * @param string $uf
     * @param string $localidade
     * @param string $logradouro
     * @param int|null $page
     * @param int|null $size
     * @return
     */
    public static function enderecos(?string $uf, ?string $localidade, ?string $logradouro, ?int $page = 0, ?int $size = 10): array
    {
        $localidade = self::formatarLocalidade($localidade);
        $logradouro = rawurlencode($logradouro);
        $url = PLUG_URL ."/" . PLUG_VERSION . "/enderecos?uf={$uf}&logradouro={$logradouro}&localidade={$localidade}&page={$page}&size={$size}";
        return self::execute($url);
    }

    /**
     * Executa a requisição para o PLUG
     *
     * @param string $url
     * @return array
     */
    private static function execute(string $url): array
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $header = ['Content-Type: application/json'];
        if (APPLICATION_ENV == 'production') {
            $bearerToken = Agro_Essor_Plug_Auth::login();
            $header[] = "Authorization: Bearer {$bearerToken}";
        }

        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_COOKIEJAR, sys_get_temp_dir() . '/cookie.txt');
        curl_setopt($ch, CURLOPT_COOKIEFILE, sys_get_temp_dir() . '/cookie.txt');
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        
        $data = json_decode($response, true);

        if (empty($data) || $httpCode != 200) {

            $prefixo = (APPLICATION_ENV != 'production') ? "[PLUG] " : "";

            if (array_key_exists('msgs', $data)) {
                throw new Exception($prefixo . $data['msgs']);
            }
            
            if (array_key_exists('mensagem', $data)) {
                throw new Exception($prefixo . $data['mensagem']);
            }
            
            throw new Exception("{$prefixo} Erro ao buscar o CEP.");
        }

        return $data;
    }

    /**
     * Método para formatar a localidade pois quando é informado o logradouro, os cep diferencia minúsculas e maísculas na localidade
     *
     * @param string $localidade
     * @return string
     */
    private static function formatarLocalidade(string $localidade): string
    {
        $localidade = mb_convert_case(strtolower($localidade), MB_CASE_TITLE, "UTF-8");
        $minusculas = ['De', 'Do', 'Da', 'Dos', 'Das', 'E'];

        foreach ($minusculas as $palavra) {
            $localidade = preg_replace('/\b' . $palavra . '\b/u', strtolower($palavra), $localidade);
        }

        return rawurlencode($localidade);
    }
}
