# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Brcobranca::Remessa::Cnab240::Ailos do
  let(:pagamento) do
    Brcobranca::Remessa::Pagamento.new(valor: 199.9,
                                       data_vencimento: Date.current,
                                       nosso_numero: 123,
                                       numero: 123,
                                       documento: 6969,
                                       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',
                                       uf_sacado: 'SP',
                                       codigo_multa: '2',
                                       percentual_multa: 2.0)
  end
  let(:params) do
    { empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
      agencia: '12345',
      conta_corrente: '1234567',
      documento_cedente: '12345678901',
      convenio: '123456',
      digito_agencia: '1',
      sequencial_remessa: '000001',
      pagamentos: [pagamento] }
  end
  let(:ailos) { subject.class.new(params) }

  context 'validacoes' do
    context '@digito_agencia' do
      it 'deve ser invalido se nao possuir o digito da agencia' do
        objeto = subject.class.new(params.merge!(digito_agencia: nil))
        expect(objeto.invalid?).to be true
        expect(objeto.errors.full_messages).to include('Digito agencia não pode estar em branco.')
      end

      it 'deve ser invalido se o digito da agencia nao tiver 1 digito' do
        ailos.digito_agencia = '12'
        expect(ailos.invalid?).to be true
        expect(ailos.errors.full_messages).to include('Digito agencia deve ter 1 dígito.')
      end
    end

    context '@convenio' do
      it 'deve ser invalido se nao possuir o convenio' do
        objeto = subject.class.new(params.merge!(convenio: nil))
        expect(objeto.invalid?).to be true
        expect(objeto.errors.full_messages).to include('Convenio não pode estar em branco.')
      end

      it 'deve ser invalido se o convenio tiver mais de 6 digitos' do
        ailos.convenio = '1234567'
        expect(ailos.invalid?).to be true
        expect(ailos.errors.full_messages).to include('Convenio deve ter 6 dígitos.')
      end
    end

    context '@conta_corrente' do
      it 'deve ser invalido se nao possuir o conta corrente' do
        objeto = subject.class.new(params.merge!(conta_corrente: nil))
        expect(objeto.invalid?).to be true
        expect(objeto.errors.full_messages).to include('Conta corrente não pode estar em branco.')
      end

      it 'deve ser invalido se o conta corrente tiver mais de 7 digitos' do
        ailos.conta_corrente = ''.rjust(8, '0')
        expect(ailos.invalid?).to be true
        expect(ailos.errors.full_messages).to include('Conta corrente deve ter 7 dígitos.')
      end
    end
  end

  context 'formatacao' do
    it 'codigo do banco deve retornar 085' do
      expect(ailos.cod_banco).to eq '085'
    end

    it 'nome do banco deve ser Ailos com 30 posicoes' do
      nome_banco = ailos.nome_banco
      expect(nome_banco.size).to eq 30
      expect(nome_banco[0..4]).to eq 'AILOS'
    end

    it 'versao do layout do arquivo deve retornar 087' do
      expect(ailos.versao_layout_arquivo).to eq '087'
    end

    it 'versao do layout do lote deve ser 045' do
      expect(ailos.versao_layout_lote).to eq '045'
    end

    it 'codigo do convenio deve ser 20 caracteres' do
      expect(ailos.codigo_convenio).to eq '123456'.ljust(20, ' ')
    end

    it 'convenio lote deve retornar as informacoes nas posicoes corretas' do
      conv_lote = ailos.convenio_lote
      expect(conv_lote[0..5]).to eq '123456'
      expect(conv_lote[6..19]).to eq ''.rjust(14, ' ')
    end

    it 'info_conta deve retornar as informacoes nas posicoes corretas' do
      info_conta = ailos.info_conta
      expect(info_conta[0..4]).to eq '12345'            # agencia
      expect(info_conta[5]).to eq '1'                   # digito agencia
      expect(info_conta[6..17]).to eq '000001234567'    # conta corrente
      expect(info_conta[18]).to eq '9'                  # dv conta corrente
      expect(info_conta[19]).to eq ' '                  # dv agencia/conta
    end

    it 'complemento header deve retornar as informacoes nas posicoes corretas' do
      comp_header = ailos.complemento_header
      expect(comp_header.size).to eq 29
      expect(comp_header[0..28]).to eq ''.rjust(29, ' ')
    end

    it 'complemento trailer deve retornar as informacoes nas posicoes corretas' do
      comp_trailer = ailos.complemento_trailer
      expect(comp_trailer.size).to eq 217

      total_cobranca_simples    = '00000100000000000019990'
      total_cobranca_vinculada  = ''.rjust(23, '0')
      total_cobranca_caucionada = ''.rjust(23, '0')
      total_cobranca_descontada = ''.rjust(23, '0')

      expect(comp_trailer).to eq "#{total_cobranca_simples}#{total_cobranca_vinculada}" \
                                 "#{total_cobranca_caucionada}#{total_cobranca_descontada}".ljust(217, ' ')
    end

    it 'complemento P deve retornar as informacoes nas posicoes corretas' do
      comp_p = ailos.complemento_p pagamento
      expect(comp_p.size).to eq 34
      expect(comp_p[0..11]).to eq '000001234567'        # conta corrente
      expect(comp_p[12]).to eq '9'                      # dv conta corrente
      expect(comp_p[13]).to eq ' '                      # dv agencia/conta
      expect(comp_p[14..33]).to eq '12345679000000123'.ljust(20, ' ') # nosso numero
    end

    it 'tipo do documento deve ser 1 - Tradicional' do
      expect(ailos.tipo_documento).to eq '1'
    end

    it 'deve conter a identificacao do titulo da empresa' do
      segmento_p = ailos.monta_segmento_p(pagamento, 1, 2)
      expect(segmento_p[195..219]).to eq '6969'.ljust(25, ' ')
    end
  end

  context 'geracao remessa' do
    it_behaves_like 'cnab240'

    context 'arquivo' do
      before { Timecop.freeze(Time.local(2015, 7, 14, 16, 15, 15)) }

      after { Timecop.return }

      it { expect(ailos.gera_arquivo).to eq(read_remessa('remessa-ailos-cnab240.rem', ailos.gera_arquivo)) }
    end
  end
end
