# -*- encoding: utf-8 -*-
shared_examples_for 'cnab400' do
  let(:pagamento) do
    Brcobranca::Remessa::Pagamento.new(valor: 199.9,
      data_vencimento: Date.today,
      nosso_numero: 123,
      documento_sacado: '12345678901',
      nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
      endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
      bairro_sacado: 'São josé dos quatro apostolos magros',
      cep_sacado: '12345678',
      cidade_sacado: 'Santa rita de cássia maria da silva',
      nome_avalista: 'ISABEL CRISTINA LEOPOLDINA ALGUSTA MIGUELA GABRIELA RAFAELA GONZAGA DE BRAGANÇA E BOURBON',
      uf_sacado: 'SP')
  end
  let(:params) do
    if subject.class == Brcobranca::Remessa::Cnab400::Bradesco
      { carteira: '01',
        agencia: '12345',
        conta_corrente: '1234567',
        digito_conta: '1',
        empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
        sequencial_remessa: '1',
        codigo_empresa: '123',
        pagamentos: [pagamento] }
    elsif subject.class == Brcobranca::Remessa::Cnab400::Citibank
      {
        portfolio: '17777751042700080112',
        carteira: '1',
        empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
        documento_cedente: '12345678910',
        pagamentos: [pagamento]
      }
    elsif subject.class == Brcobranca::Remessa::Cnab400::Santander
      {
        codigo_transmissao: '17777751042700080112',
        empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
        documento_cedente: '12345678910',
        pagamentos: [pagamento]
      }
    else
      { carteira: '123',
        agencia: '1234',
        conta_corrente: '12345',
        digito_conta: '1',
        empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
        documento_cedente: '12345678910',
        pagamentos: [pagamento] }
    end
  end
  let(:objeto) { subject.class.new(params) }

  it 'header deve ter 400 posicoes' do
    expect(objeto.monta_header.size).to eq 400
  end

  it 'detalhe deve falhar se pagamento nao for valido' do
    expect { objeto.monta_detalhe(Brcobranca::Remessa::Pagamento.new, 1) }.to raise_error(Brcobranca::RemessaInvalida)
  end

  it 'detalhe deve ter 400 posicoes' do
    expect(objeto.monta_detalhe(pagamento, 1).size).to eq 400
  end

  context 'trailer' do
    it 'trailer deve ter 400 posicoes' do
      expect(objeto.monta_trailer(1).size).to eq 400
    end

    it 'informacoes devem estar posicionadas corretamente no trailer' do
      trailer = objeto.monta_trailer 3
      expect(trailer[0]).to eq '9' # identificacao registro
      expect(trailer[1..393]).to eq ''.rjust(393, ' ') # brancos
      expect(trailer[394..399]).to eq '000003' # numero sequencial do registro
    end
  end

  it 'montagem da remessa deve falhar se o objeto nao for valido' do
    expect { subject.class.new.gera_arquivo }.to raise_error(Brcobranca::RemessaInvalida)
  end

  it 'remessa deve conter os registros mais as quebras de linha' do
    remessa = objeto.gera_arquivo
    expect(remessa.size).to eq 1204

    # registros
    expect(remessa[0..399]).to eq objeto.monta_header
    expect(remessa[402..801]).to eq objeto.monta_detalhe(pagamento, 2).upcase
    expect(remessa[804..1203]).to eq objeto.monta_trailer(3)
    # quebras de linha
    expect(remessa[400..401]).to eq "\r\n"
    expect(remessa[802..803]).to eq "\r\n"
  end

  it 'deve ser possivel adicionar mais de um pagamento' do
    objeto.pagamentos << pagamento
    remessa = objeto.gera_arquivo

    expect(remessa.size).to eq 1606
  end
end
