class Base::ConfiguracaoDeFeriado < ApplicationRecord
  has_paper_trail

  validates_presence_of :descricao_do_feriado, :tipo_de_feriado, :data_do_feriado

  validates :data_do_feriado, uniqueness: { scope: :tipo_de_feriado, message: 'Já existe um feriado com esta data e tipo de feriado' }

  validate :validar_feriado_existente
  
  before_save :set_ano_e_mes_de_referencia

  enum mes_de_referencia: {
    janeiro: 1,
    fevereiro: 2,
    marco: 3,
    abril: 4,
    maio: 5,
    junho: 6,
    julho: 7,
    agosto: 8,
    setembro: 9,
    outubro: 10,
    novembro: 11,
    dezembro: 12
  }

  enum tipo_de_feriado: {
    nacional: 1,
    estadual: 2,
    municipal: 3,
    facultativo: 4
  }

  def set_ano_e_mes_de_referencia
		self.mes_de_referencia = data_do_feriado.month
		self.ano_de_referencia = data_do_feriado.year
  end

  def validar_feriado_existente
    feriados_existente = self.class.where.not(id: id)
                                  .where("extract(month from data_do_feriado) = ?", data_do_feriado.month)
                                  .where("extract(day from data_do_feriado) = ?", data_do_feriado.day)
                                  .where(tipo_de_feriado: tipo_de_feriado)
                                  .where.not(tipo_de_feriado: 'facultativo')
    errors.add(:data_do_feriado, 'Já existe um feriado para este dia e mês') if feriados_existente.exists?
  end
end
