class GestaoDeEstoque::ControleDoAlmoxarifado < ApplicationRecord
  has_paper_trail

  belongs_to :orcamento, class_name: "::Orcamento"

  validates_presence_of :data_de_encerramento, :orcamento

  validate :so_pode_haver_um_encerramento_por_mes, unless: Proc.new{ self.ano_encerramento? }
  validate :so_pode_encerrar_se_ultimo_mes_ainda_nao_existir, unless: Proc.new{ self.ano_encerramento? }
  validate :so_pode_haver_um_encerramento_anual_por_ano, if: Proc.new{ self.ano_encerramento? }

  after_create :atualiza_permissao_de_movimentacao_de_estoque, if: Proc.new { self.ano_encerramento? }

  def atualiza_permissao_de_movimentacao_de_estoque
    Configuracao.last.update_column(:permite_encerramento_anual_do_estoque, true)
  end

  def existe_encerramento_de_dezembro?
    GestaoDeEstoque::ControleDoAlmoxarifado.where(orcamento: contexto_atual.id).all.select{|control| control.data_de_encerramento.month == 12}.any?
  end

  def existe_encerramento_anual?
    GestaoDeEstoque::ControleDoAlmoxarifado.where.not(ano_encerramento: nil).where(orcamento: contexto_atual.id).any?
  end
  
  def so_pode_haver_um_encerramento_por_mes
    if GestaoDeEstoque::ControleDoAlmoxarifado.where(orcamento: contexto_atual.id).select{ |control| control.data_de_encerramento.month == self.data_de_encerramento.month }.any?
      errors.add(:base, "Não pode haver mais de um encerramento por mês.")
    end
  end

  def so_pode_encerrar_se_ultimo_mes_ainda_nao_existir
    if self.existe_encerramento_de_dezembro?
      errors.add(:base, "Não pode haver mais encerramento. O mês de Dezembro já foi gerado.")
    end
  end

  def so_pode_haver_um_encerramento_anual_por_ano
    if self.existe_encerramento_anual?
      errors.add(:base, "Não pode haver mais de um encerramento anual.")
    end
  end
end
