class Contabilidade::TransacaoDaConciliacao < ApplicationRecord
  has_paper_trail

  belongs_to :conciliacao_bancaria, class_name: "Contabilidade::ConciliacaoBancaria"
  belongs_to :movimentacao, class_name: "Contabilidade::MovimentacaoDaContaBancaria"

  has_many :conciliacoes
  has_many :movimentacoes_da_conta_bancaria, through: :conciliacoes

  validates_presence_of :tipo, :nome, :valor, :data, :fit_id, :conciliacao_bancaria_id

  enum status: {
    pendente: 0,
    conciliado: 1,
    descartado: 99
  }

  def conta_bancaria_por_unidade_orcamentaria_principal
    self.conciliacao_bancaria.conta_bancaria.contas_bancarias_por_unidade_orcamentaria.find_by(principal: true)
  end

  def pesquisa_movimentacao_sugerida(movimentacoes_da_conta_bancaria = nil)
    if self.pendente?
      if self.valor.to_f > 0
        tipo_de_movimentacao = 1
      else
        tipo_de_movimentacao = 2
      end
      if movimentacoes_da_conta_bancaria.present?
        movimentacoes = movimentacoes_da_conta_bancaria.joins(conta_bancaria_por_unidade_orcamentaria: :conta_bancaria).where("base_contas_bancarias.id = ?", self.conciliacao_bancaria.conta_bancaria_id).where("data_da_movimentacao = ? and valor = ? and conciliada is not true and tipo_de_movimentacao = ?", self.data, self.valor, tipo_de_movimentacao).all
      else
        movimentacoes = Contabilidade::MovimentacaoDaContaBancaria.joins(conta_bancaria_por_unidade_orcamentaria: :conta_bancaria).where("base_contas_bancarias.id = ?", self.conciliacao_bancaria.conta_bancaria_id).where("data_da_movimentacao = ? and valor = ? and conciliada is not true and tipo_de_movimentacao = ?", self.data, self.valor, tipo_de_movimentacao).all
      end
      if movimentacoes.size == 1
        self.movimentacao = movimentacoes.first
        return movimentacoes.first
      else
        return nil
      end
    else
      return nil
    end
  end

  def conciliar(movimentacao_da_conta_bancaria_id)
    conciliacao = Contabilidade::Conciliacao.find_by_movimentacao_da_conta_bancaria_id(movimentacao_da_conta_bancaria_id)
    if conciliacao.present?
      return false
    else
      conciliacao = Contabilidade::Conciliacao.create(
        transacao_da_conciliacao_id: self.id,
        movimentacao_da_conta_bancaria_id: movimentacao_da_conta_bancaria_id,
        grupo: SecureRandom.uuid
      )
      conciliacao.persisted? ? true : false
    end
  end
end
