# frozen_string_literal: true

module Brcobranca
  module Remessa
    module Cnab240
      class Ailos < Brcobranca::Remessa::Cnab240::Base
        # digito da agencia
        attr_accessor :digito_agencia

        validates_presence_of :digito_agencia, :convenio, :conta_corrente, message: 'não pode estar em branco.'
        validates_length_of :convenio, maximum: 6, message: 'deve ter 6 dígitos.'
        validates_length_of :conta_corrente, maximum: 7, message: 'deve ter 7 dígitos.'
        validates_length_of :digito_agencia, is: 1, message: 'deve ter 1 dígito.'

        def initialize(campos = {})
          campos = { emissao_boleto: '2',
                     forma_cadastramento: '0',
                     distribuicao_boleto: '2',
                     especie_titulo: '02' }.merge!(campos)
          super(campos)
        end

        def convenio=(valor)
          @convenio = valor.to_s.rjust(6, '0') if valor
        end

        def conta_corrente=(valor)
          @conta_corrente = valor.to_s.rjust(7, '0') if valor
        end

        def cod_banco
          '085'
        end

        def nome_banco
          'AILOS'.ljust(30, ' ')
        end

        def versao_layout_arquivo
          '087'
        end

        def versao_layout_lote
          '045'
        end

        def codigo_convenio
          convenio.ljust(20, ' ')
        end

        def uso_exclusivo_banco
          ''.rjust(20, ' ')
        end

        def uso_exclusivo_empresa
          ''.ljust(20, ' ')
        end

        def convenio_lote
          codigo_convenio
        end

        def info_conta
          # CAMPO            # TAMANHO
          # agencia          5
          # digito agencia   1
          # conta corrente   12
          # dv da conta      1
          # dv agencia/conta 1
          "#{agencia_conta_corrente}#{agencia_conta_corrente_dv}"
        end

        def agencia_conta_corrente
          "#{agencia.to_s.rjust(5, '0')}#{digito_agencia}#{conta_corrente.rjust(12, '0')}#{conta_corrente_dv}"
        end

        def conta_corrente_dv
          conta_corrente.modulo11(mapeamento: { 10 => 0 })
        end

        def agencia_conta_corrente_dv
          ' '
        end

        def complemento_header
          ''.rjust(29, ' ').to_s
        end

        def complemento_trailer
          "#{''.rjust(69, '0')}#{''.rjust(148, ' ')}"
        end

        def tipo_documento
          '1'
        end

        def complemento_p(pagamento)
          # CAMPO                 TAMANHO
          # conta_corrente        12
          # dv conta corrente     1
          # dv agencia/conta      1
          # ident. titulo         20
          "#{conta_corrente.rjust(12,
                                  '0')}#{conta_corrente_dv}#{agencia_conta_corrente_dv}#{ajusta_nosso_numero(pagamento)}"
        end

        def ajusta_nosso_numero(pagamento)
          "#{conta_corrente}#{conta_corrente_dv}#{pagamento.nosso_numero.to_s.rjust(9, '0')}".ljust(20, ' ')
        end

        def identificacao_titulo_empresa(pagamento)
          pagamento.documento_ou_numero.to_s.ljust(25, ' ')
        end

        def complemento_trailer
          # CAMPO                               TAMANHO
          # Qt. Títulos em Cobrança Simples     6
          # Vl. Títulos em Carteira Simples     15 + 2 decimais
          # Qt. Títulos em Cobrança Vinculada   6
          # Vl. Títulos em Carteira Vinculada   15 + 2 decimais
          # Qt. Títulos em Cobrança Caucionada  6
          # Vl. Títulos em Carteira Caucionada  15 + 2 decimais
          # Qt. Títulos em Cobrança Descontada  6
          # Vl. Títulos em Carteira Descontada  15 + 2 decimais
          total_cobranca_simples    = "#{quantidade_titulos_cobranca}#{valor_titulos_carteira}"
          total_cobranca_vinculada  = ''.rjust(23, '0')
          total_cobranca_caucionada = ''.rjust(23, '0')
          total_cobranca_descontada = ''.rjust(23, '0')

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

        def total_segmentos(pagamentos)
          pagamentos.inject(0) do |total, pagamento|
            total + (pagamento.codigo_multa == '0' ? 2 : 3)
          end
        end

        def monta_segmento_r(pagamento, nro_lote, contador)
          return nil if pagamento.codigo_multa == '0'

          super(pagamento, nro_lote, contador)
        end

        def codigo_baixa(_pagamento)
          '2'
        end

        def dias_baixa(_pagamento)
          ''.rjust(3, ' ')
        end
      end
    end
  end
end
