
class Base::Item < ApplicationRecord
	has_paper_trail

	attr_default :combustivel, false
	attr_default :perecivel, false

	belongs_to :unidade_de_medida, required: true
	belongs_to :ncm, required: false
	belongs_to :categoria, inverse_of: :itens

	has_many :itens_do_pedido, dependent: :restrict_with_exception, class_name: 'Licitacao::ItemDoPedido', foreign_key: 'item_id'
	has_many :itens_da_ordem_de_compra, dependent: :restrict_with_exception, class_name: 'Licitacao::ItemDaOrdemDeCompra', foreign_key: 'item_id'
	has_many :itens_do_empenho, dependent: :restrict_with_exception, class_name: 'Contabilidade::ItemDoEmpenho', foreign_key: 'item_id'
	has_many :itens_do_empenho_retroativo_do_contrato, dependent: :restrict_with_exception, class_name: 'Licitacao::ItemDoEmpenhoRetroativoDoContrato', foreign_key: 'item_id'
	has_many :itens_da_nota_fiscal, dependent: :restrict_with_exception, class_name: 'Contabilidade::ItemDaNotaFiscal', foreign_key: 'item_id'
	has_many :itens_da_acao, dependent: :restrict_with_exception, class_name: 'Pca::ItemDaAcao', foreign_key: 'item_id'

	has_many :estoques, dependent: :restrict_with_exception, class_name: 'GestaoDeEstoque::Estoque', foreign_key: 'item_id'
	has_many :itens_do_recebimento_de_materiais, dependent: :restrict_with_exception, class_name: 'GestaoDeEstoque::ItemDoRecebimentoDeMaterial', foreign_key: 'item_id'
	has_many :itens_da_requisicao_de_materiais, dependent: :restrict_with_exception, class_name: 'Administrativo::ItemDaRequisicaoDeMaterial', foreign_key: 'item_id'
	has_many :itens_da_transferencia, class_name: "GestaoDeEstoque::ItemDaTransferencia"
	has_many :itens_do_consumo, class_name: "GestaoDeEstoque::ItemDoConsumo"

	has_many :bens_patrimoniais, class_name: "Patrimonio::BemPatrimonial"
	has_many :bens_da_importacao_de_dados_patrimoniais, class_name: "Patrimonio::BensDaImportacaoDeDadosPatrimonial"
	has_many :itens_da_transferencia, class_name: "Patrimonio::ItemDaTransferencia"

	validates_presence_of :descricao, :unidade_de_medida_id, :categoria_id

	validates_uniqueness_of :descricao, scope: :categoria_id, message: "Item já cadastrado nessa mesma categoria.", case_sensitive: false
	validates_uniqueness_of :ncm_id, scope: [:descricao, :categoria_id], message: "Ncm já está em uso para esse item, nessa mesma categoria", allow_blank: true

	validates_associated :categoria

	validate :codigo_na_prefeitura_composto_por_numeros?

	before_destroy :valida_se_item_esta_em_uso

	ransacker :id do
	Arel::Nodes::SqlLiteral.new(
		"regexp_replace(to_char(\"#{table_name}\".\"id\", '99999999'), ' ', '', 'g')"
	)

	end

	def descricao_sem_scapes
		descricao.gsub(/\r\n/, '')
	end

	def esta_sendo_usado?
		itens_do_pedido.any? || itens_da_ordem_de_compra.any? || itens_do_empenho.any? || itens_da_nota_fiscal.any? || estoques.any? || itens_do_recebimento_de_materiais.any? || itens_do_consumo.any?
	end

	def quantidade_de_bens_com_mesmo_item_e_mesma_unidade_gestora_e_centro_de_custo(unidade_gestora = nil, centro_de_custo = nil)
		quantidade = 0 if (unidade_gestora.nil? || centro_de_custo.nil?)
		if unidade_gestora.present? && centro_de_custo.present?
			quantidade = self.bens_patrimoniais.where('patrimonio_bens_patrimoniais.status = 1 AND patrimonio_bens_patrimoniais.unidade_gestora_id = ?', unidade_gestora.to_i).select{|bem| bem.localizacao_atual.centro_de_custo_id == centro_de_custo.to_i }.size
		end

		return quantidade
	end

	def descricao_do_item
		"#{descricao} (#{self.try(:unidade_de_medida).try(:descricao)})"
	end

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

	def codigo_e_descricao
		"#{id} - " + descricao
	end

	def codigo_e_descricao_do_item
		"#{id} - " + descricao_do_item
	end

	def descricao_codigo_na_prefeitura_e_unidade
		"#{codigo_na_prefeitura + ' - ' if codigo_na_prefeitura.present? } #{descricao} (#{self.try(:unidade_de_medida).try(:descricao)})"
	end

	def descricao_codigo_na_prefeitura_e_unidade_destacada
		"#{codigo_e_descricao} <strong>(#{unidade_de_medida.descricao})</strong>".html_safe
	end

	def descricao_e_codigo_na_prefeitura
		codigo_na_prefeitura.present? ? "#{descricao} (#{codigo_na_prefeitura})" : "#{descricao}"
	end

	def codigo_descricao_e_codigo_na_prefeitura
		codigo_na_prefeitura.present? ? "#{id} - #{descricao} (#{codigo_na_prefeitura})" : "#{id} - #{descricao}"
	end

	def codigo_descricao_unidade_codigo_da_prefeitura
		codigo_na_prefeitura.present? ? "#{id} - #{self.try(:descricao)} - (#{unidade_de_medida.try(:descricao)}) - #{codigo_na_prefeitura}" : "#{id} - #{self.try(:descricao)} - (#{unidade_de_medida.try(:descricao)})"
	end

	def codigo_descricao_tecnica_unidade_codigo_da_prefeitura
		codigo_na_prefeitura.present? ? "#{id} - #{self.try(:descricao)} - Desc. Téc: #{descricao_tecnica} - (#{unidade_de_medida.try(:descricao)}) - #{codigo_na_prefeitura}" : "#{id} - #{self.try(:descricao)} - Desc. Téc: #{descricao_tecnica} - (#{unidade_de_medida.try(:descricao)})"
	end

	def valida_se_item_esta_em_uso
		tabelas = [
			"administrativo_itens_das_requisicoes_de_materiais",
			"contabilidade_itens_da_nota_fiscal",
			"contabilidade_itens_do_empenho",
			"contabilidade_itens_dos_rps_cancelados",
			"gestao_de_estoque_estoques",
			"gestao_de_estoque_itens_da_transferencia",
			"gestao_de_estoque_itens_das_devolucoes_de_materiais",
			"gestao_de_estoque_itens_do_consumo",
			"gestao_de_estoque_itens_do_recebimento_de_materiais",
			"licitacao_importacoes_tcm_itens",
			"licitacao_itens_da_ordem_de_compra",
			"licitacao_itens_do_aditivo_de_mudanca",
			"licitacao_itens_do_pedido",
			"patrimonio_bens_patrimoniais",
			"patrimonio_itens_da_requisicao_patrimonial",
			"patrimonio_itens_da_transferencia",
			"patrimonio_itens_dos_recebimentos_de_bens"
		]

		tabelas.each do |tabela|
			if ActiveRecord::Base.connection.execute("SELECT COUNT(*) FROM #{tabela} where id = ?", self.id).first['count'].to_i > 0
				errors.add(:base, "Este item não pode ser excluído pois está sendo utilizado em #{tabela}.")
				throw(:abort)
			end
		end
	end

	private
	def codigo_na_prefeitura_composto_por_numeros?
		errors.add(:codigo_na_prefeitura, "deve ser numérico") if codigo_na_prefeitura.present? && !codigo_na_prefeitura.numeric?
	end
end
