# frozen_string_literal: true

module Brcobranca
  module Remessa
    module Cnab240
      class Caixa < Brcobranca::Remessa::Cnab240::Base
        # digito da agencia
        attr_accessor :digito_agencia
        # versao do aplicativo da CAIXA
        attr_accessor :versao_aplicativo
        # modalidade da carteira
        #   opcoes:
        #     11: título Registrado emissão CAIXA
        #     14: título Registrado emissão Cedente
        #     21: título Sem Registro emissão CAIXA
        attr_accessor :modalidade_carteira

        # identificacao da emissao do boleto (attr na classe base)
        #   opcoes:
        #     ‘1’ = Banco Emite
        #     ‘2’ = Cliente Emite ou para Bloqueto Pré-Impresso Registrado (entrega do bloqueto pelo Cedente)
        #     ‘4’ = Banco Reemite
        #     ‘5’ = Banco Não Reemite
        #
        # identificacao da distribuicao do boleto (attr na classe base)
        #   opcoes:
        #     ‘0’ = Postagem pelo Cedente
        #     ‘1’ = Sacado via Correios
        #     ‘2’ = Cedente via Agência CAIXA
        #     ‘3’ = Sacado via e-mail
        #     ‘4’ = Sacado via SMS

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

        def initialize(campos = {})
          # Modalidade carteira: 14 (título Registrado emissão Cedente)
          campos = { modalidade_carteira: '14',
                     emissao_boleto: '2',
                     codigo_baixa: '2',
                     dias_baixa: '000',
                     distribuicao_boleto: '0',
                     especie_titulo: '99' }.merge!(campos)
          super(campos)
        end

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

        def versao_aplicativo=(valor)
          @versao_aplicativo = valor.to_s.rjust(4, '0') if valor
        end

        def cod_banco
          '104'
        end

        def nome_banco
          'CAIXA ECONOMICA FEDERAL'.ljust(30, ' ')
        end

        def versao_layout_arquivo
          '050'
        end

        def versao_layout_lote
          '030'
        end

        def codigo_convenio
          ''.rjust(20, '0')
        end

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

        def uso_exclusivo_empresa
          'REMESSA-PRODUCAO'.ljust(20, ' ')
        end

        def convenio_lote
          "#{convenio.rjust(6, '0')}#{''.rjust(14, '0')}"
        end

        def info_conta
          # CAMPO            # TAMANHO
          # agencia          5
          # digito agencia   1
          # cod. convenio    6
          # uso CAIXA        7
          # uso CAIXA        1
          "#{agencia.to_s.rjust(5, '0')}#{digito_agencia}#{convenio}#{''.rjust(7, '0')}0"
        end

        def complemento_header
          versao = versao_aplicativo || ''
          "#{versao.rjust(4, ' ')}#{''.rjust(25, ' ')}"
        end

        def exclusivo_servico
          '00'
        end

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

        def tipo_documento
          '2'
        end

        def complemento_p(pagamento)
          # CAMPO                 TAMANHO
          # convenio              6
          # uso CAIXA             11
          # modalidade carteira   2
          # ident. titulo         15
          "#{convenio.rjust(6,
                            '0')}#{''.rjust(11,
                                            '0')}#{modalidade_carteira}#{pagamento.nosso_numero.to_s.rjust(15, '0')}"
        end

        def complemento_r
          segmento_r = ''
          segmento_r += ''.rjust(50, ' ')  # e-mail do sacado     50
          segmento_r << ''.rjust(11, ' ')  # exclusivo FEBRABAN   11
          segmento_r
        end

        def numero(pagamento)
          "#{pagamento.formata_documento_ou_numero(11, '0')}#{''.rjust(4, ' ')}"
        end

        def identificacao_titulo_empresa(pagamento)
          "#{pagamento.formata_documento_ou_numero(11, '0')}#{''.rjust(14, ' ')}"
        end

        def data_multa(pagamento)
          return ''.rjust(8, '0') if pagamento.codigo_multa == '0'

          data_multa = pagamento.data_vencimento + 1
          data_multa.strftime('%d%m%Y')
        end

        def codigo_baixa(pagamento)
          return '1' if pagamento.codigo_protesto.to_s == '3'

          '2'
        end

        def dias_baixa(pagamento)
          return '120' if pagamento.codigo_protesto.to_s == '3'

          '000'
        end

        def data_mora(pagamento)
          return ''.rjust(8, '0') unless %w[1 2].include? pagamento.tipo_mora

          data_mora = pagamento.data_vencimento + 1
          data_mora.strftime('%d%m%Y')
        end
      end
    end
  end
end
