<?php

declare(strict_types=1);

class Agro_CalculoCoberturaTecnica
{   
    // IMPORTANTE MANTER SEMPRE ORDENADO
    protected static $tabelaConversaoPrazoCurto = [
        '0.13' => 0.04109589, 
        '0.20'=> 0.082191781,
        '0.27' => 0.123287671, 
        '0.30'=> 0.164383562, 
        '0.37' => 0.205479452, 
        '0.40' => 0.246575342, 
        '0.46' => 0.287671233, 
        '0.50 '=> 0.328767123, 
        '0.56' => 0.369863014, 
        '0.60'=> 0.410958904, 
        '0.66' => 0.452054795, 
        '0.70'=> 0.493150685, 
        '0.73' => 0.534246575, 
        '0.75' => 0.575342466, 
        '0.78' => 0.616438356, 
        '0.80'=> 0.657534247, 
        '0.83' => 0.698630137, 
        '0.85' => 0.739726027, 
        '0.88' => 0.780821918, 
        '0.90'=> 0.821917808, 
        '0.93' => 0.863013699, 
        '0.95' => 0.904109589, 
        '0.98' => 0.945205479, 
        '1.00' => 1 
    ];

    public static function getConversaoPrazoCurto(string $paymentPercentage): float
    {
        if ($paymentPercentage == '0') {
            $firstKey = array_key_first(self::$tabelaConversaoPrazoCurto);
            return self::$tabelaConversaoPrazoCurto[$firstKey];
        }

        $paymentPercentage = bcdiv($paymentPercentage, '1', 2);
		$currentPercentage = INF;

        if (!empty(self::$tabelaConversaoPrazoCurto[$paymentPercentage])) {
            return self::$tabelaConversaoPrazoCurto[$paymentPercentage];
        }

        foreach (self::$tabelaConversaoPrazoCurto as $key => $val) {
            $currentPercentage = $val;

            if ($paymentPercentage < $key) {
                return $currentPercentage;
            }
        }
    }

    public static function calcula(
        Agro_ParameterObject_CalculoCoberturaTecnica $calculoCoberturaTecnica
    ): array {
        $dataInicioCobertura =  $calculoCoberturaTecnica->getDataInicioCobertura();
        $dataVigenciaInicioOriginal = $calculoCoberturaTecnica->getDataInicioVigenciaOriginal();
        $dataFimVigencia = $calculoCoberturaTecnica->getDataFimVigencia();
        $dataBoleto = $calculoCoberturaTecnica->getDataVencimentoBoleto();

        $dataInicioEstimadoCobertura = $dataInicioCobertura->compareDate($dataVigenciaInicioOriginal) >= 0
            ? $dataInicioCobertura
            : $dataVigenciaInicioOriginal;
            
        $diff = $dataFimVigencia->sub($dataInicioEstimadoCobertura)->toValue();
        $tempoDeCoberturaEmDias = floor((($diff / 60) / 60) / 24);

        $percentagemPagamento = $calculoCoberturaTecnica->getValorPremioSeguradoJaPago() / $calculoCoberturaTecnica->getValorPremioSegurado();
        
        $percentagemASerAplicada = self::getConversaoPrazoCurto((string) $percentagemPagamento);
        $prazoCurtoPagamentoEmDias = $percentagemASerAplicada * $tempoDeCoberturaEmDias;
        
        $dataFinalVigenciaRecalculado = clone $dataInicioEstimadoCobertura;
        $dataFinalVigenciaRecalculado->addDay(ceil($prazoCurtoPagamentoEmDias));

        $dataFinalCoberturaTecnica = $dataFinalVigenciaRecalculado->compareDate($dataBoleto) >= 0
        	? $dataFinalVigenciaRecalculado
        	: $dataBoleto;

        return [
            'dataInicioEstimadoCobertura' => $dataInicioEstimadoCobertura,
            'dataFinalVigenciaRecalculado' => $dataFinalVigenciaRecalculado, 
            'dataFinalCoberturaTecnica' =>  $dataFinalCoberturaTecnica,
            'percentagemPrazoCurtoAplicada' => $percentagemASerAplicada
        ];
    }
}