class Licitacao::Processo < Licitacao::Projeto
	has_many :impugnacoes, foreign_key: :projeto_id
  	has_many :arquivos_bll_dos_processos, class_name: "Licitacao::ArquivoBllDoProcesso"
	validate :valida_edicao_do_numero_do_processo
	validates :numero_do_processo, length: { maximum:15 }, if: Proc.new{ self.envia_pro_sim? }

	scope :despachados, -> { where("licitacao_projetos.status > 0 and licitacao_projetos.status not in (89,90,91,97,98)") }
	scope :homologados, -> { where("licitacao_projetos.status = 99") }
	scope :vao_para_o_portal, -> { where("licitacao_projetos.status in (2, 99)")  }

	def homologado_total?
		if self.homologado?
			if self.lotes.homologados.where('ganhador_id is null').any?
				return false
			else
				return true
			end
		end
	end
	
	def todos_itens_enviados_ao_sim?
		itens_do_lote.all? { |item_do_lote| item_do_lote.arquivo_id.present? }
	end

	def todos_lotes_pre_enviados_ao_sim?
		lotes.all? { |lote| lote.ganhador_id.present? } && configuracoes_sim_do_projeto.any? { |configuracao| configuracao.arquivo_id.nil? }
	end

	def todo_o_sim_foi_enviado?
		todos_itens_enviados_ao_sim? || todos_lotes_pre_enviados_ao_sim?
	end

	def faltando_dados_a_serem_enviados_ao_sim?
		!todo_o_sim_foi_enviado?
	end

	def adiciona_licitantes pessoas
		quantidade = 0
		pessoas.each do |pessoa|
			if self.pessoas_do_projeto.build(pessoa_id: pessoa.to_i)
				quantidade += 1
			end
		end
		return quantidade
	end

	def atualiza_data_da_homologacao(data_da_homologacao)
		self.update_columns(data_da_homologacao: data_da_homologacao)
		return true
	end

	def atualiza_data_de_adjudicacao(data_de_adjudicacao)
		self.update_columns(data_de_adjudicacao: data_de_adjudicacao)
		return true
	end

	aasm column: :status, enum: true, whiny_transitions: false do
		state :aberto, :initial => true
		state :enviado_para_comissao
		state :aguardando_publicacao
		state :em_sessao
		state :pos_sessao
		state :em_recurso
		state :aguardando_parecer_final
		state :aguardando_homologacao
		state :homologado
		state :adjudicado

		event :voltar_para_aberto do
			transitions from: :enviado_para_comissao, to: :aberto
			transitions from: :aguardando_publicacao, to: :aberto
			transitions from: :em_sessao, to: :aberto
			transitions from: :pos_sessao, to: :aberto
			transitions from: :em_recurso, to: :aberto
			transitions from: :aguardando_parecer_final, to: :aberto
			transitions from: :aguardando_homologacao, to: :aberto
			transitions from: :homologado, to: :aberto
			after do
				retorna_de_processo_para_projeto
			end
		end
		event :voltar_para_fase_de_lances do
			transitions from: :homologado, to: :em_sessao do
				guard do
					self.homologado? && !self.contratos.any? && !self.atas_de_registro_de_precos.any? && !self.enviado_para_o_sim?
				end

				after do
					self.update_attribute(:homologado_parcialmente, false)
				end
			end
			transitions from: :adjudicado, to: :em_sessao do
				guard do
					self.adjudicado? && !self.contratos.any? && !self.atas_de_registro_de_precos.any? && !self.enviado_para_o_sim?
				end

				after do
					self.update_attribute(:homologado_parcialmente, false)
				end
			end
		end
		event :voltar_para_enviado_pra_comissao do
			transitions from: :homologado, to: :enviado_para_comissao do
				guard do
					self.homologado? && !self.contratos.any? && !self.atas_de_registro_de_precos.any? && !self.enviado_para_o_sim?
				end
				after do
					self.update_attribute(:homologado_parcialmente, false)
				end
			end
			transitions from: :adjudicado, to: :enviado_para_comissao do
				guard do
					self.adjudicado? && !self.contratos.any? && !self.atas_de_registro_de_precos.any? && !self.enviado_para_o_sim?
				end

				after do

					self.update_attribute(:homologado_parcialmente, false)
				end
			end
		end
	end

	def pode_cadastrar_fornecedor?
		pode_cadastrar_na_lei_8666 = pode_adicionar_licitante? && todos_os_lotes_tem_ganhador? == false
		(lei_federal == 'lei_8666_93' and pode_cadastrar_na_lei_8666) or lei_federal == 'lei_14133_21'
	end

	def retorna_de_processo_para_projeto
		self.numero_do_processo = nil
		self.data_inicial_do_processo = nil
		self.data_da_sessao = nil
		self.data_de_adjudicacao = nil
		self.data_da_homologacao = nil
		self.horario_da_abertura = nil
		self.impugnacoes.destroy_all
		self.publicacoes.destroy_all
		if self.carona? == false && self.eh_dispensa_ou_inexigibilidade? == false
			self.lotes.each do |lote|
				lote.pessoas_do_projeto_do_lote.each do |pessoa_do_projeto_do_lote|
					pessoa_do_projeto_do_lote.exclui_ganhador
				end
			end
			self.pessoas_do_projeto.destroy_all
		end
		self.save(validate: false)
	end

	private
	def valida_edicao_do_numero_do_processo
		if !simplificado? && (enviado_para_o_sim? || possui_contratos? || possui_empenhos?) && self.numero_do_processo_changed?
			errors.add(:numero_do_processo, 'Não é possivel configurar o número. O processo possui contratos, está empenhado ou já foi enviado para o sim')
		end
	end
end
