<?php

class Sistema_Collection_TermosContratacao
{
    /**
     * @var Sistema_Entity_TermosContratacao[]
     */
    private array $termosContratacao;

    public function add(Sistema_Entity_TermosContratacao $termosContratacao, bool $comIndiceChave = true): void
    {
        if ($comIndiceChave) {
            $this->addComIndiceChave($termosContratacao);
        } else {
            $this->addSemIndiceChave($termosContratacao);
        }
    }

    public function addComIndiceChave(Sistema_Entity_TermosContratacao $termosContratacao): void
    {
        $this->termosContratacao[$termosContratacao->getChave()] = $termosContratacao;
    }

    public function addSemIndiceChave(Sistema_Entity_TermosContratacao $termosContratacao): void
    {
        $this->termosContratacao[] = $termosContratacao;
    }

    public function getByChave(string $chave): Sistema_Entity_TermosContratacao
    {
        $termosChave = array_filter(
            $this->termosContratacao
            , function (Sistema_Entity_TermosContratacao $termoContratacao) use ($chave) {
            return $termoContratacao->getChave() === $chave;
        }
        );

        return !empty($termosChave) ? current($termosChave) : Sistema_Entity_TermosContratacao::criarInstanciaVazia();
    }

    public function getByIndiceChave(string $chave): Sistema_Entity_TermosContratacao
    {
        return $this->termosContratacao[$chave] ?? new Sistema_Entity_TermosContratacao();
    }

    /**
     * @param string $chave
     * @return Sistema_Entity_TermosContratacao|null
     * @throws Zend_Date_Exception
     */
    public function getTermoMenorInicioValidade(string $chave = ''): ?Sistema_Entity_TermosContratacao
    {
        $entityMenorInicioValidade = null;

        foreach ($this->termosContratacao as $termoContratacao) {
            if (!empty($chave) && $chave !== $termoContratacao->getChave()) {
                continue;
            }

            if (
                $entityMenorInicioValidade === null
                || $termoContratacao->getDataInicioValidade()->getDate()->compare(
                    $entityMenorInicioValidade->getDataInicioValidade()->getDate()
                ) < 0
            ) {
                $entityMenorInicioValidade = $termoContratacao;
            }
        }

        return $entityMenorInicioValidade ?? Sistema_Entity_TermosContratacao::criarInstanciaVazia();
    }

    public function getTermoValidadeIgualMaiorPorChave(
        string            $chave
        , Agro_Utils_Date $dataValidacao
    ): Sistema_Entity_TermosContratacao
    {
        $termoValido = null;

        foreach ($this->termosContratacao as $termoContratacao) {
            if ($chave !== $termoContratacao->getChave()) {
                continue;
            }

            if (
                $termoContratacao->getDataInicioValidade()->getDate()->compare(
                    $dataValidacao->getDate()
                ) >= 0
            ) {
                $termoValido = $termoContratacao;
            }
        }

        return $termoValido ?? Sistema_Entity_TermosContratacao::criarInstanciaVazia();

    }
}