<?php

class Agro_Cep
{
    private string $uf = '';
    private string $localidade = '';
    private string $logradouro = '';
    private string $cep = '';
    private int $page = 0;
    private int $size = 10;
    private array $retorno = [];

    /**
     * Define o CEP
     *
     * @param string $cep
     */
    public function setCep(string $cep): void
    {
        $this->cep = $cep;
    }

    /**
     * Define a UF
     *
     * @param string $uf
     */
    public function setUF(string $uf): void
    {
        $this->uf = trim($uf);
    }

    /**
     * Define a localidade
     *
     * @param string $localidade
     */
    public function setLocalidade(string $localidade): void
    {
        $this->localidade = trim($localidade);
    }

    /**
     * Define o logradouro
     *
     * @param string $logradouro
     */
    public function setLogradouro(string $logradouro): void
    {
        $this->logradouro = trim($logradouro);
    }

    public function setPage(int $page): void
    {
        $this->page = $page;
    }

    /**
     * @param int $size
     */
    public function setSize(int $size): void
    {
        $this->size = $size;
    }

    /**
     * Busca as informações do CEP informado ou dos dados da UF, localidade(município) e/ou logradouro
     *
     * @return array|null
     * @throws Exception
     */
    public function getCepInfo(): ?array
    {
        if (!empty($this->cep)) {
            $data = Agro_Essor_Plug_Enderecos::cep($this->cep);
            $retorno = $this->getEstadoMunicipio($data);
        } else {
            $data = Agro_Essor_Plug_Enderecos::enderecos(
                $this->uf,
                $this->localidade,
                $this->logradouro,
                $this->page,
                $this->size
            );

            $retorno = $data;
            foreach ($data['itens'] as $index => $item) {
                $retorno['itens'][$index] = $this->getEstadoMunicipio($item);
            }
        }

        $this->retorno = $retorno;
        return $retorno;
    }

    /**
     * Buscam os id de estado e de município e adiciona ao retorno
     *
     * @param array $data
     * @return array
     * @throws Exception
     */
    private function getEstadoMunicipio(array $data): array
    {
        if (!empty($data['localidadeSuperior'])) {
            $data['localidade'] = $data['localidadeSuperior'];
        }

        $data['id_estado'] = (new Sistema_Model_Estados())->getId($data['uf']);

        //turn around para palavras com apostrofos
        if (strpos($data['localidade'], '\'' === false)) {
            $rowMunicipio = (new Sistema_Model_Municipios())->fetchRow(
                ['upper(unaccent(ds_nome_municipio)) = upper(unaccent(\'' . $data['localidade'] . '\'))', "id_estado = {$data['id_estado']}"]
            );
        } else {
            $rowMunicipio = (new Sistema_Model_Municipios())->fetchRow(
                ['upper(unaccent(ds_nome_municipio)) like upper(unaccent(\'' . str_replace('\'', '%', $data['localidade']) . '\'))', "id_estado = {$data['id_estado']}"]
            );
        }

        if (empty($rowMunicipio)) {
            throw new Exception('Município não encontrado.');
        }

        $data['id_municipio'] = $rowMunicipio->id;
        return $data;
    }

    /**
     * Retorna o primeiro item no array itens, criado após execução do método getCepInfo
     * @return array
     */
    public function currentItem(): array
    {
        $retorno = empty($this->retorno) ? $this->retorno : [];

        if (!empty($this->retorno)) {
            $currentItem = current($this->retorno['itens']);
            $retorno = !empty($currentItem) ? $currentItem : [];
        }

        return $retorno;
    }
}
