<?php

use Agro_Utils_Bancos_BaseBanco as BaseBanco;
use Agro_Utils_Bancos_DigitoVerificadorInterface as DigitoVerificadorInterface;

class Agro_Utils_Bancos_Santander extends BaseBanco implements DigitoVerificadorInterface
{
    const CODIGO = '033';

    private array $tiposContaValidas = [
        '01', '02', '03', '05', '07', '09', '13', '27', '35', '37', '43', '45', '46', '48', '50', '53', '60', '92'
    ];

    public function __construct(string $numeroAgencia, string $numeroConta)
    {
        $this->totalCaracteresNumeroConta = 8;

        if (!in_array(substr($numeroConta, 0, 2), $this->tiposContaValidas)) {
            throw new Exception('Tipo de conta inválida.');
        }

        parent::__construct($numeroAgencia, $numeroConta);
    }

    /**
     * Santander não possui dígito verificador na agência, não sendo necessário cálculo
     * @return int|null
     */
    public function calcularDigitoVerificadorAgencia(): ?int
    {
        return null;
    }

    public function calcularDigitoVerificadorConta(): int
    {
        $numeroAgenciaConvertido = str_split("{$this->numeroAgencia}00{$this->numeroConta}");
        $multiplicadores = [9, 7, 3, 1, 0, 0, 9, 7, 1, 3, 1, 9, 7, 3];
        $calculo = 0;

        foreach ($numeroAgenciaConvertido as $indice => $numero) {
            $valor = $numero * $multiplicadores[$indice];

            /**
             * Remove as dezenas do valor calculado
             * Ex.: Multiplicação = 54
             *      Valor real = 4
             */
            $valor = str_split($valor);
            $valor = end($valor);

            $calculo += $valor;
        }

        /**
         * Remove as dezenas do valor calculado
         * Ex.: Multiplicação = 54
         *      Valor real = 4
         */
        $calculo = str_split($calculo);
        $calculo = (int)end($calculo);

        return $calculo === 0 ? 0 : 10 - $calculo;
    }

    /**
     * Sobrescrito o método, pois o Santander não possui dígito verificador na agência
     * @param string $digitoVerificador
     * @return bool
     */
    public function digitoVerificadorAgenciaValido(string $digitoVerificador = ''): bool
    {
        return true;
    }
}
