class Licitacao::UnidadeOrcamentariaPorPedido < ApplicationRecord
	has_paper_trail

	belongs_to :unidade_orcamentaria, class_name: 'Loa::UnidadeOrcamentaria', required: true
	belongs_to :responsavel_do_pedido, class_name: "Base::AgentePublicoMunicipal", foreign_key: :responsavel_do_pedido_id
	delegate :nome, to: :unidade_orcamentaria, prefix: "unidade"
	belongs_to :pedido, required: true

	delegate :pessoas_do_pedido, to: :pedido, allow_nil: true

	has_many :itens_do_pedido_por_unidade_orcamentaria, dependent: :destroy
	has_many :itens_do_pedido, through: :itens_do_pedido_por_unidade_orcamentaria
	has_many :contratos, dependent: :restrict_with_exception

	validates_uniqueness_of :unidade_orcamentaria_id, scope: :pedido_id, if: Proc.new{ self.persisted? }

	validate :verifica_se_unidade_orcamentaria_tem_ordenador

	def verifica_se_unidade_orcamentaria_tem_ordenador
		if self.unidade_orcamentaria.present? and self.unidade_orcamentaria.ordenadores_de_despesa.empty?
			errors.add(:unidade_orcamentaria_id, "Essa unidade orçamentaria não possui ordenador de despesa")
		end
	end

	def valor_total_itens_por_quantidade
		total = 0
			self.itens_do_pedido_por_unidade_orcamentaria.por_quantidade.each do |item|
				valor = item.item_do_pedido.itens_do_pedido_por_pessoa.validos.minimum(:preco_de_cotacao)
				valor_multiplicado = item.quantidade * valor.to_d * item.periodicidade.to_d
				total += valor_multiplicado
			end
		return total
	end

	def valor_total_da_menor_cotacao_global
		total = 0
		pessoa_do_pedido_com_menor_cotacao = pessoas_do_pedido.pessoas_que_cotaram_todos.min_by(&:total_da_cotacao)

		itens_do_pedido_por_unidade_orcamentaria.por_quantidade.sum { |item| item.menor_valor_cotado(pessoa_do_pedido_com_menor_cotacao) }
	end

	def valor_total_preco_medio
		total = 0

		self.itens_do_pedido_por_unidade_orcamentaria.por_quantidade.each do |item_por_unidade_orcamentaria|
			item_do_pedido = self.itens_do_pedido.find_by(id: item_por_unidade_orcamentaria.item_do_pedido_id)
			total += item_por_unidade_orcamentaria.quantidade * item_do_pedido.try(:preco_medio).to_d  * item_por_unidade_orcamentaria.periodicidade.to_d
		end

		return total
	end

	def valor_total_mediana
		return self.itens_do_pedido_por_unidade_orcamentaria.por_quantidade.map{ |item| item.item_do_pedido.total_mediana }.sum
	end

	def preenchido?
		self.itens_do_pedido_por_unidade_orcamentaria.any?
	end

	def quantidade_de_itens_por_preco
		self.itens_do_pedido_por_unidade_orcamentaria.joins(:item_do_pedido).where(licitacao_itens_do_pedido: {tipo: Licitacao::ItemDoPedido.tipos["por_preco"]}).sum(:quantidade)
	end

	def valor_previsto_de_itens
		self.itens_do_pedido_por_unidade_orcamentaria.joins(:item_do_pedido).sum(:valor_previsto_desconto)
	end
end
