class Contabilidade::RetornoBancario < ApplicationRecord
  include TradutorConcern

  has_paper_trail

  attr_accessor :numero_do_pagamento

  belongs_to :banco, class_name: "Base::Banco"
  has_many :itens_do_retorno_bancario

  attr_default :status, :recebido

  has_attached_file :arquivo
	validates_attachment_content_type :arquivo, content_type: ["text/plain", "application/txt", "application/octet-stream"]
	validates_attachment_size :arquivo, in: 0..5.megabytes, allow_nil: true

  # validates_uniqueness_of :numero_da_remessa, message: 'Número da remessa já está em uso'

  validates_presence_of :arquivo, unless: Proc.new { Rails.env.test? }
  validates_presence_of :tipo

  validate :valida_contem_pagamentos

  after_create :ler_arquivo_obn350, if: Proc.new { self.arquivo.present? && self.obn350? }
  after_create :ler_arquivo_cnab240, if: Proc.new { self.arquivo.present? && self.cnab240? }
  validate :ler_arquivo_cnab240, if: Proc.new { self.arquivo.present? && self.cnab240? }

  enum tipo: {
		obn350: 1,
		cnab240: 2
	}

  enum status: {
		recebido: 1,
		processado: 2,
    recusada: 3,
    cancelado: 99
	}

  def ler_arquivo_cnab240
    errors.add(:tipo, "função não implementada")
  end

  def valida_contem_pagamentos
    arquivo = Paperclip.io_adapters.for(self.arquivo).read.force_encoding(Encoding::UTF_8)
    numero_linhas = arquivo.lines.count
    errors.add(:arquivo, "Arquivo não contém pagamentos.") unless numero_linhas > 2
  end

  def ler_arquivo_obn350
    f = open(self.arquivo.queued_for_write[:original].path)
    dados = f.readlines.map(&:chomp)

    if dados.size >= 2
      numero_da_remessa = dados[0][47..51]
      numero_do_contrato = dados[0][58..66] # procurar banco quando souber onde gravar o número do contrato nos envios de lote
      status_da_remessa = dados[0][72..73]
      motivo_da_devolucao = dados[0][74..117]

      self.update_attributes(numero_da_remessa: numero_da_remessa, numero_do_contrato: numero_do_contrato, motivo_da_devolucao: motivo_da_devolucao)
      if status_da_remessa.to_s == "<>"
        self.update_column(:status, :recusada)
      else
        dados[1, dados.size - 2].each do |d|
          Contabilidade::ItemDoRetornoBancario.create(
            retorno_bancario: self,
            conteudo: d.to_s
          )
        end
        self.update_column(:status, :processado)
      end

    end
  end

end
