class Licitacao::ItemDoPedidoPorPessoa < ApplicationRecord
	include MensagemConcern

	has_paper_trail

	attr_default :valido, true
	attr_default :preco_de_cotacao, 0

	delegate :item, to: :item_do_pedido, allow_nil: true

	belongs_to :item_do_pedido, inverse_of: :itens_do_pedido_por_pessoa
	belongs_to :pessoa_do_pedido

	validates_presence_of :item_do_pedido_id, :pessoa_do_pedido_id
	validates_presence_of :marca, if: Proc.new { self.eh_necessario_ter_marca? }
	validates_presence_of :motivo, unless: :valido?

	validates_uniqueness_of :pessoa_do_pedido_id, scope: :item_do_pedido_id
	validates_numericality_of :preco_de_cotacao, greater_than: 0, if: Proc.new { self.marca.present? }
	# Validação retirada a pedido da consultoria, pois é necessário em alguns casos com mais de 2 casas decimais
	# validates :preco_de_cotacao, casas_decimais: 2, unless: Proc.new { item_do_pedido && item_do_pedido.combustivel }

	after_create :cria_mensagem_cotacao_externa
	after_save :apaga_a_si_mesmo_se_nao_for_informado_preco, unless: Proc.new{ self.pessoa_do_pedido.pedido.por_valor_previsto? && self.pessoa_do_pedido.pedido.todos_os_itens_por_preco?}

	scope :validos, -> { joins(:pessoa_do_pedido).where("licitacao_pessoas_do_pedido.valido is true and licitacao_itens_do_pedido_por_pessoa.valido is true") }
	scope :invalidos, -> { joins(:pessoa_do_pedido).where("licitacao_pessoas_do_pedido.valido is false or licitacao_itens_do_pedido_por_pessoa.valido is false") }
	scope :validos_e_por_preco, -> { where(valido: true).joins(:item_do_pedido).where(licitacao_itens_do_pedido: {valido: true, tipo: Licitacao::ItemDoPedido.tipos["por_preco"]}) }
	scope :validos_e_por_quantidade, -> { where(valido: true).joins(:item_do_pedido).where('licitacao_itens_do_pedido.por_valor_previsto is false') }
	scope :validos_e_por_desconto, -> { where(valido: true).joins(:item_do_pedido).where(licitacao_itens_do_pedido: {valido: true, tipo: Licitacao::ItemDoPedido.tipos["por_desconto"]}) }
	scope :validos_e_por_valor_previsto, -> { where(valido: true).joins(:item_do_pedido).where(licitacao_itens_do_pedido: {valido: true, por_valor_previsto: true } ) }

	def desconto_de_cotacao
		self.preco_de_cotacao.to_f
	end

	def total
		(self.item_do_pedido.quantidade_total_requisitada * self.preco_de_cotacao).to_f.round(2)
	end

	def total_por_desconto
		(self.item_do_pedido.valor_total_previsto_por_desconto).to_f.round(2)
	end

	def total_com_taxa
		porcentagem = self.item_do_pedido.valor_total_previsto_por_desconto * self.preco_de_cotacao / 100 
		self.item_do_pedido.valor_total_previsto_por_desconto + porcentagem rescue 0
	end

	def total_valor_previsto_por_preco
		self.preco_de_cotacao.to_d + self.item_do_pedido.valor_total_previsto_por_desconto
	end

	def eh_necessario_ter_marca?
		if self.try(:item).try(:categoria).try(:tipo) != "servico" && self.try(:item_do_pedido).try(:por_preco?) && self.try(:item_do_pedido).try(:por_valor_previsto?) == false
			return self.preco_de_cotacao.present? && self.preco_de_cotacao > 0
		else
			return false
		end
	end

	private
	def apaga_a_si_mesmo_se_nao_for_informado_preco
		self.delete unless self.preco_de_cotacao.to_f > 0
	end
end
