package br.com.caelum.stella.boleto.bancos;

import br.com.caelum.stella.boleto.Beneficiario;
import br.com.caelum.stella.boleto.Boleto;
import br.com.caelum.stella.boleto.bancos.gerador.GeradorDeDigitoSantander;

import java.net.URL;

import static br.com.caelum.stella.boleto.utils.StellaStringUtils.leftPadWithZeros;

public class Santander extends AbstractBanco {

    private static final long serialVersionUID = 1L;

    private final static String NUMERO_SANTANDER = "033";
    private final static String DIGITO_SANTANDER = "7";
    private GeradorDeDigitoSantander gdivSantander = new GeradorDeDigitoSantander();

    @Override
    public String geraCodigoDeBarrasPara(Boleto boleto) {
        Beneficiario beneficiario = boleto.getBeneficiario();
        StringBuilder campoLivre = new StringBuilder("9");
        campoLivre.append(getNumeroConvenioFormatado(beneficiario));
        campoLivre.append(getNossoNumeroFormatado(beneficiario));
        campoLivre.append("0").append(beneficiario.getCarteira());
        return new CodigoDeBarrasBuilder(boleto).comCampoLivre(campoLivre);
    }

    @Override
    public URL getImage() {
        String pathDoArquivo = "/br/com/caelum/stella/boleto/img/%s.png";
        String imagem = String.format(pathDoArquivo, NUMERO_SANTANDER);
        return getClass().getResource(imagem);
    }

    @Override
    public String getNumeroFormatado() {
        return NUMERO_SANTANDER;
    }

    @Override
    public String getCarteiraFormatado(Beneficiario beneficiario) {
        return leftPadWithZeros(beneficiario.getCarteira(), 3);
    }

    @Override
    public String getCodigoBeneficiarioFormatado(Beneficiario beneficiario) {
        return leftPadWithZeros(beneficiario.getCodigoBeneficiario(), 7);
    }

    @Override
    public String getNossoNumeroFormatado(Beneficiario beneficiario) {
        String nossoNumero = beneficiario.getNossoNumero();
        if (beneficiario.getDigitoNossoNumero() != null) {
            return leftPadWithZeros(nossoNumero + beneficiario.getDigitoNossoNumero(), 13);
        }
        return leftPadWithZeros(nossoNumero + getGeradorDeDigito().calculaDVNossoNumero(nossoNumero), 13);
    }

    @Override
    public String getNumeroFormatadoComDigito() {
        StringBuilder builder = new StringBuilder();
        builder.append(NUMERO_SANTANDER).append("-");
        return builder.append(DIGITO_SANTANDER).toString();
    }

    @Override
    public String getNossoNumeroECodigoDocumento(Boleto boleto) {
        Beneficiario beneficiario = boleto.getBeneficiario();

        String nossoNumero = getNossoNumeroFormatado(beneficiario);
        StringBuilder builder = new StringBuilder();
        builder.append(nossoNumero, 0, 12);
        builder.append("-").append(nossoNumero.substring(12));
        return builder.toString();
    }

    @Override
    public GeradorDeDigitoSantander getGeradorDeDigito() {
        return gdivSantander;
    }

    public String getNumeroConvenioFormatado(Beneficiario beneficiario) {
        return leftPadWithZeros(beneficiario.getNumeroConvenio(), 7);
    }
}