<?php

use Agro_Utils_Bancos_BaseBanco as BaseBanco;
use Agro_Utils_Bancos_DigitoVerificadorInterface as DigitoVerificadorInterface;

class Agro_Utils_Bancos_BancoBrasil extends BaseBanco implements DigitoVerificadorInterface
{
    const CODIGO = '001';

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

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

    public function calcularDigitoVerificadorAgencia(): string
    {
        return $this->calculoDigitoVerificador(5);
    }

    public function calcularDigitoVerificadorConta(): string
    {
        return $this->calculoDigitoVerificador(9, false);
    }

    private function calculoDigitoVerificador(int $multiplicador, bool $digitoAgencia = true): string
    {
        $somaDigitosMultiplicadores = 0;
        $numeroAgenciaConvertido = str_split($digitoAgencia ? $this->numeroAgencia : $this->numeroConta);

        foreach ($numeroAgenciaConvertido as $numero) {
            $somaDigitosMultiplicadores += $numero * $multiplicador;
            $multiplicador--;
        }

        $restoDivisao = $somaDigitosMultiplicadores % 11;
        $resultado = 11 - $restoDivisao;

        return $resultado === 10 ? 'X' : ($resultado === 11 ? '0' : (string)$resultado);
    }
}