# frozen_string_literal: true

module Brcobranca
  module Remessa
    module Cnab400
      class Credisis < Brcobranca::Remessa::Cnab400::Base
        attr_accessor :codigo_cedente, :documento_cedente, :convenio

        validates_presence_of :agencia, :conta_corrente, :codigo_cedente, :digito_conta,
                              message: 'não pode estar em branco.'
        validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
        validates_length_of :codigo_cedente, maximum: 4, message: 'deve ter 4 dígitos.'
        validates_length_of :conta_corrente, maximum: 8, message: 'deve ter 8 dígitos.'
        validates_length_of :carteira, maximum: 2, message: 'deve ter 2 dígitos.'
        validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
        validates_length_of :sequencial_remessa, :convenio, maximum: 7, message: 'deve ter 7 dígitos.'

        # Nova instancia do CrediSIS
        def initialize(campos = {})
          campos = { aceite: 'N' }.merge!(campos)
          super(campos)
        end

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

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

        def carteira=(valor)
          @carteira = valor.to_s.rjust(2, '0') if valor
        end

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

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

        def cod_banco
          '097'
        end

        def nome_banco
          'CENTRALCRED'.ljust(15, ' ')
        end

        # Informacoes da conta corrente do cedente
        #
        # @return [String]
        #
        def info_conta
          # CAMPO            TAMANHO
          # agencia          4
          # complemento      1
          # conta corrente   8
          # digito da conta  1
          # complemento      6
          "#{agencia} #{conta_corrente}#{digito_conta}#{''.rjust(6, ' ')}"
        end

        # Complemento do header
        #
        # @return [String]
        #
        def complemento
          sequencial_remessa.to_s.ljust(294, ' ')
        end

        def formata_nosso_numero(nosso_numero)
          "0#{codigo_cedente}#{nosso_numero.rjust(6, '0')}"
        end

        # Detalhe do arquivo
        #
        # @param pagamento [PagamentoCnab400]
        #   objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
        # @param sequencial
        #   num. sequencial do registro no arquivo
        #
        # @return [String]
        #
        def monta_detalhe(pagamento, sequencial)
          raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?

          detalhe = '1'                                                     # identificacao transacao               9[01]
          detalhe += Brcobranca::Util::Empresa.new(documento_cedente).tipo  # tipo de identificacao da empresa      9[02]
          detalhe << documento_cedente.to_s.rjust(14, '0')                  # cpf/cnpj da empresa                   9[14]
          detalhe << agencia                                                # agencia                               9[04]
          detalhe << ''.rjust(1, ' ')                                       # brancos                               X[01]
          detalhe << conta_corrente                                         # conta corrente                        9[08]
          detalhe << digito_conta                                           # dac                                   9[01]
          detalhe << ''.rjust(6, ' ')                                       # complemento do registro (brancos)     X[06]
          detalhe << pagamento.documento_ou_numero.to_s.ljust(25) # identificacao do tit. na empresa      X[25]
          detalhe << formata_nosso_numero(pagamento.nosso_numero.to_s)      # nosso numero                          9[11]
          detalhe << ''.rjust(37, ' ')                                      # brancos                               X[37]
          detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento                   X[10]
          detalhe << pagamento.data_vencimento.strftime('%d%m%y')           # data do vencimento                    A[06]
          detalhe << pagamento.formata_valor                                # valor do documento                    9[13]
          detalhe << ''.rjust(11, ' ')                                      # brancos                               X[11]
          detalhe << pagamento.data_emissao.strftime('%d%m%y')              # data de emissao                       9[06]
          detalhe << ''.rjust(4, ' ')                                       # brancos                               X[04]
          detalhe << pagamento.formata_valor_mora(4).ljust(6, '0')          # valor mora ao dia                     9[06]
          detalhe << pagamento.formata_percentual_multa.ljust(6, '0')       # valor multa                           9[06]
          detalhe << ''.rjust(33, ' ')                                      # brancos                               X[33]
          detalhe << pagamento.formata_valor_desconto                       # valor do desconto                     9[13]
          detalhe << pagamento.identificacao_sacado                         # identificacao do pagador              9[02]
          detalhe << pagamento.documento_sacado.to_s.rjust(14, '0')         # documento do pagador                  9[14]
          detalhe << pagamento.nome_sacado.format_size(40)                  # nome do pagador                       A[40]
          detalhe << pagamento.endereco_sacado.format_size(37)              # endereco do pagador                   A[37]
          detalhe << pagamento.bairro_sacado.format_size(15)                # bairro do pagador                     X[15]
          detalhe << pagamento.cep_sacado                                   # cep do pagador                        9[08]
          detalhe << pagamento.cidade_sacado.format_size(15)                # cidade do pagador                     A[15]
          detalhe << pagamento.uf_sacado                                    # uf do pagador                         A[02]
          detalhe << pagamento.nome_avalista.format_size(25)                # nome do sacador/avalista              X[25]
          detalhe << ''.rjust(1, ' ')                                       # complemento do registro               X[01]
          detalhe << ''.rjust(14, ' ')                                      # documento avalista                    X[14] *
          detalhe << pagamento.dias_protesto.rjust(2, '0')                  # quantidade de dias do prazo           9[02]
          detalhe << ''.rjust(1, ' ')                                       # complemento do registro (brancos)     X[01]
          detalhe << sequencial.to_s.rjust(6, '0')                          # numero do registro no arquivo         9[06]
          detalhe
        end
      end
    end
  end
end
