# frozen_string_literal: true

require 'parseline'

module Brcobranca
  module Retorno
    module Cnab400
      # Formato de Retorno CNAB 400
      class BancoBrasilia < Brcobranca::Retorno::Base
        extend ParseLine::FixedWidth

        def self.load_lines(file, options = {})
          default_options = { except: [1] } # por padrao ignora a primeira linha que é header
          options = default_options.merge!(options)

          super(file, options)
        end

        fixed_width_layout do |parse|
          # Todos os campos descritos no documento em ordem
          # :tipo_de_registro, 0..0 # identificacao do registro transacao
          parse.field :codigo_registro, 0..0

          # :codigo_de_inscricao, 1..2 # identificacao do tipo de inscricao/empresa
          # :numero_de_inscricao, 3..16 # numero de inscricao da empresa (cpf/cnpj)
          # :zeros, 17..19

          # Identificacao da empresa no banco
          # :zeros, 20..20
          parse.field :cedente_com_dv, 20..36

          # :numero_controle_empresa, 37..61, # numero de controle da empresa
          # :zeros, 62..69

          # :nosso_numero, 62..69 # identificacao do titulo no banco
          parse.field :nosso_numero, 70..81

          # :zeros, 82..91 # uso do banco
          # :zeros, 92..103 # uso do banco
          # :indicador_de_rateio, 104..104 # indicador de rateio de credito
          # :zeros, 105..106
          # :carteira, 107..107 # de novo?
          parse.field :codigo_ocorrencia, 108..109
          parse.field :data_ocorrencia, 110..117
          # :nosso_numero, 128..133 # confirmacao do numero do titulo no banco
          # :brancos, 134..145 # complemento de registro

          parse.field :data_vencimento, 148..155
          parse.field :valor_titulo, 156..168
          parse.field :banco_recebedor, 169..171

          # :agencia_cobradora, 168..171 # agencia cobradora, ag de liquidacao ou baixa
          # :dac_ag_cobradora, 172..172 # dac da agencia cobradora
          # :agencia_recebedora_com_dv, 168..172

          parse.field :especie_documento, 177..178
          parse.field :valor_tarifa, 179..191

          # :outras_despesas 188..200, # valor de outras despesas ou custos do protesto
          # :juros_operacao_em_atraso, 201..213 # zeros?

          parse.field :iof, 218..230
          parse.field :valor_abatimento, 231..243
          parse.field :desconto, 244..256
          parse.field :valor_recebido, 257..269
          parse.field :outros_recebimento, 283..295

          # :brancos, 292..293
          # :motivo_do_codigo_de_ocorrencia, 294..294

          # :data_credito, 295..300 # data de credito desta liquidacao
          parse.field :data_credito, 299..306

          # :origem_pagamento, 301..303
          # :brancos, 304..313
          # :cheque_bradesco, 314..317
          # :motivo_rejeicao, 318..327
          # :brancos, 328..367
          # :numero_do_cartorio, 368..369
          # :numero_do_protocolo, 370..379
          # :brancos, 380..393

          parse.field :motivo_ocorrencia, 364..393

          parse.field :sequencial, 394..399
        end
      end
    end
  end
end
