class Base::Categoria < ApplicationRecord
	include TradutorConcern
	has_paper_trail

	belongs_to :categoria_superior, class_name: "Base::Categoria"

	has_many :subcategorias, class_name: "Base::Categoria", foreign_key: "categoria_superior_id", dependent: :destroy
	has_many :itens, inverse_of: :categoria

	has_many :elementos_por_categoria, class_name: "Base::ElementoPorCategoria"
	has_many :elementos_de_despesa, through: :elementos_por_categoria, source: :elemento_de_gasto, source_type: "NaturezaDaDespesa::ElementoDeDespesa"
	has_many :elementos_de_despesa_do_orcamento, through: :elementos_de_despesa, source: :classificacoes_de_despesa
	has_many :sub_elementos_de_despesa, through: :elementos_por_categoria, source: :elemento_de_gasto, source_type: "NaturezaDaDespesa::SubElementoDeDespesa"
	has_many :sub_elementos_de_despesa_do_orcamento, through: :sub_elementos_de_despesa, source: :classificacoes_da_despesa, class_name: "Contabilidade::SubElementoDeDespesa"

	has_many :categorias_do_pedido, class_name: 'Licitacao::CategoriaDoPedido', dependent: :destroy
	has_many :pedidos, through: :categorias_do_pedido, class_name: 'Licitacao::Pedido'
	has_many :categorias_da_solucao, class_name: 'Licitacao::CategoriaDaSolucao', dependent: :destroy
	has_many :solucoes_do_etp, class_name: 'Licitacao::SolucoesDoEtp'

	validates_presence_of :titulo, :tipo, :codigo
	validates_length_of :codigo, maximum: 3
	validates_uniqueness_of :codigo, scope: [:categoria_superior_id]

	validate :nivel_maximo_de_categorias
	validate :nao_deve_possuir_itens_e_categorias

	scope :principais, -> { where(categoria_superior_id: nil) }
	scope :subcategorias, -> { where.not(categoria_superior_id: nil) }

	before_validation :atribui_tipo, if: :subcategoria?

	enum tipo: {
		produto: 0,
		servico: 1
	}

	def codigo_e_titulo
		"#{codigo} - #{titulo}"
	end

	def categoria_e_subcategoria
		if principal?
			"#{titulo}"
		else
			"#{categoria_superior.titulo} / #{titulo}"
		end
	end

	def antecessoras
		[categoria_superior.try(:antecessoras), categoria_superior].compact.flatten
	end

	def subcategoria?
		categoria_superior && categoria_superior.try(:categoria_superior).nil?
	end

	def principal?
		categoria_superior.nil?
	end

	def tem_subcategorias?
		subcategorias.any?
	end

	def filhos
		if subcategorias.any?
			subcategorias
		else
			itens
		end
	end

	def quantidade_de_itens
		if subcategorias.any?
			subcategorias.includes(:itens).inject(0) {|total, subcategoria| total + subcategoria.itens.count }
		else
			itens.count
		end
	end

	def	pode_ter_itens?
		subcategorias.empty?
	end

	def generos_de_alimentacao?
		titulo.downcase == "gêneros de alimentação" && categoria_superior && categoria_superior.titulo.downcase == "material de consumo"
	end

	private
	def nivel_maximo_de_categorias
		errors.add(:base, "Você atingiu o limite de níveis de categorias") if categoria_superior && categoria_superior.subcategoria?
	end

	def atribui_tipo
		self.tipo = categoria_superior.tipo
	end

	def nao_deve_possuir_itens_e_categorias
		errors.add(:base, "não pode possuir itens e categorias") if (itens.present? && subcategorias.present?)
	end
end
