class UnidadeDeMedida < ApplicationRecord
	has_paper_trail

	has_many :itens, inverse_of: :unidade_de_medida, class_name: "Base::Item", dependent: :restrict_with_exception
	has_many :indicadores, class_name: "Ppa::Indicador", dependent: :restrict_with_exception
	has_many :quantitativos, class_name: "Ppa::Quantitativo", dependent: :restrict_with_exception

	has_many :itens_do_recebimento_de_materiais, class_name: 'GestaoDeEstoque::ItemDoRecebimentoDeMaterial', dependent: :restrict_with_exception, foreign_key: :unidade_de_medida_de_conversao_id
	has_many :itens_das_requisicoes_de_materiais, class_name: 'Administrativo::ItemDaRequisicaoDeMaterial', dependent: :restrict_with_exception
	has_many :estoques, class_name: 'GestaoDeEstoque::Estoque', dependent: :restrict_with_exception

	validates_presence_of :descricao
	validates_uniqueness_of :descricao, case_sensitive: false

	validate :case_sensitive_caracteres_acentuados, on: :create

	before_destroy :impedir_deletar_campo_percentual
	before_update :impedir_editar_campo_percentual

	attr_default :utiliza_casa_decimal, false
	attr_default :esconder_unidade, false

	scope :disponiveis, -> { where(esconder_unidade: false) }

	def descricao
		self[:descricao].to_s.upcase
	end

	def impedir_deletar_campo_percentual
		if descricao == '%'
			errors.add(:descricao, 'Você não pode deletar essa unidade de medida')
			return false
		end
	end

	def impedir_editar_campo_percentual
		if descricao_was == '%'
			errors.add(:descricao, 'Você não pode alterar essa unidade de medida')
			return false
		end
	end

	def case_sensitive_caracteres_acentuados
		unidade_de_medida_cadastrada = ::UnidadeDeMedida.where("unaccent(descricao) ilike unaccent(?)", descricao).first

		if unidade_de_medida_cadastrada.present? && unidade_de_medida_cadastrada.descricao.parameterize.eql?(descricao.parameterize)
			errors.add(:descricao, 'já está em uso')
		end
	end
end
