class GestaoDeEstoque::ItemDoConsumoPorPrograma < ApplicationRecord
  has_paper_trail

  attr_accessor :unidade_attribute
  attr_accessor :quantidade_disponivel_attribute

  belongs_to :programa_por_consumo, class_name: 'GestaoDeEstoque::ProgramaPorConsumo'
  belongs_to :estoque, class_name: "GestaoDeEstoque::Estoque"
  belongs_to :item, class_name: 'Base::Item'
  belongs_to :item_do_consumo, class_name: 'GestaoDeEstoque::ItemDoConsumo'

  validates_presence_of :estoque_id, :quantidade

  before_save :atribui_item_id
  before_save :cria_ou_atualiza_item_do_consumo
  after_create :atribui_item_do_consumo_id
  after_destroy :atualiza_ou_exclui_item_do_consumo, if: Proc.new {Rails.env.test? == false}

  def atribui_item_id
    self.item_id = self.estoque.item_id if self.estoque_id.present?
  end
  
  def atribui_item_do_consumo_id
    item_do_cons = GestaoDeEstoque::ItemDoConsumo.find_by(consumo_id: self.programa_por_consumo.consumo.id, estoque_id: self.estoque.id, item_id: self.item.id)
    self.update_column(:item_do_consumo_id, item_do_cons.id)
  end

  def cria_ou_atualiza_item_do_consumo
    itens = self.programa_por_consumo.consumo.itens_do_consumo

    if itens.pluck(:estoque_id).include?(self.estoque.id) && itens.pluck(:item_id).include?(self.item.id)
      item_do_cons = GestaoDeEstoque::ItemDoConsumo.find_by(consumo_id: self.programa_por_consumo.consumo.id, estoque_id: self.estoque.id, item_id: self.item.id)
      quant_total = (item_do_cons.quantidade_consumida + (self.quantidade - self.quantidade_was rescue 0))
      calcula_quantidade_e_total(quant_total, item_do_cons)
    else
      item_do_cons = GestaoDeEstoque::ItemDoConsumo.create!(
        consumo_id: self.programa_por_consumo.consumo.id ,
        estoque_id: self.estoque.id,
        item_id: self.item.id,
        unidade_de_medida_id: self.estoque.unidade_de_medida.id,
        quantidade_consumida: self.quantidade,
        valor_unitario: self.estoque.calcular_valor_medio_por_data_final(self.programa_por_consumo.consumo.data_de_consumo),
        total: (self.quantidade * self.estoque.calcular_valor_medio_por_data_final(self.programa_por_consumo.consumo.data_de_consumo))
      )
    end
  end

  def atualiza_ou_exclui_item_do_consumo
    itens = self.programa_por_consumo.consumo.itens_do_consumo
    if itens.pluck(:estoque_id).include?(self.estoque.id) && itens.pluck(:item_id).include?(self.item.id)
      item_do_cons = GestaoDeEstoque::ItemDoConsumo.find_by(consumo_id: self.programa_por_consumo.consumo.id, estoque_id: self.estoque.id, item_id: self.item.id)
      quant_total = (item_do_cons.quantidade_consumida - self.quantidade_was)
      if quant_total <= 0
        item_do_cons.destroy
      else
        calcula_quantidade_e_total(quant_total, item_do_cons)
      end
    end
  end

  def calcula_quantidade_e_total(quant, item_do_cons)
    total_geral = (quant * self.estoque.calcular_valor_medio_por_data_final(self.programa_por_consumo.consumo.data_de_consumo))
    item_do_cons.update_columns(quantidade_consumida: quant, total: total_geral)
  end
  
end
