module LicitacaoHelper
	def acao_permitida? object, acao
		if object.instance_of? Licitacao::Pedido
			acoes_invalidas = {
				aberto: [:editar_pessoas, :editar_quantidades, :preco, :anular_preco, :convidar],
				aguardando_outras_unidades: [:destroy, :editar_unidades_orcamentarias, :editar_pessoas, :preco, :anular_preco, :convidar],
				coleta_de_preco: [:destroy, :editar_itens, :editar_unidades_orcamentarias, :editar_itens],
				cancelado: [:edit, :destroy, :editar_unidades_orcamentarias, :editar_itens, :editar_pessoas, :cancelar, :preco, :anular_preco],
				fechado: [:destroy, :editar_pessoas, :editar_unidades_orcamentarias, :editar_itens, :editar_pessoas, :cancelar, :editar_justificativa_da_cotacao],
				projeto_gerado: [:destroy, :editar_pessoas, :editar_unidades_orcamentarias, :editar_itens, :editar_pessoas, :cancelar, :preco, :anular_preco, :editar_justificativa_da_cotacao]
			}
		end

		if object.instance_of?(Licitacao::Projeto) || object.instance_of?(Licitacao::Processo)
			acoes_invalidas = {
				aberto: [:editar_licitantes, :atualizar_licitantes],
				enviado_para_controladoria: [:encaminhar_para_controladoria, :encaminhar_para_comissao, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes, :destroy],
				enviado_para_copfin: [:encaminhar_para_comite_programacao_financeira, :encaminhar_para_controladoria, :encaminhar_para_comissao, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes, :destroy],
				aguardando_autorizacao: [:encaminhar_para_autorizacao, :encaminhar_para_comite_programacao_financeira, :encaminhar_para_controladoria, :encaminhar_para_comissao, :editar_licitantes, :atualizar_licitantes],
				autorizado: [:autorizar, :encaminhar_para_autorizacao, :encaminhar_para_comite_programacao_financeira, :encaminhar_para_controladoria,:editar_licitantes, :atualizar_licitantes, :destroy],
				enviado_para_comissao: [:encaminhar_para_comissao],
				aguardando_parecer: [ :editar_licitantes, :atualizar_licitantes, :adicionar_dotacao, :excluir_dotacao, :destroy],
				aguardando_publicacao: [:editar_licitantes, :atualizar_licitantes, :adicionar_dotacao, :excluir_dotacao, :destroy],
				em_sessao: [:encaminhar_para_comissao, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :destroy],
				suspenso: [:iniciar_processo, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :destroy],
				pos_sessao: [:edit, :destroy, :cancelar, :encaminhar_para_comissao, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes],
				em_recurso: [:edit, :destroy, :cancelar, :encaminhar_para_comissao, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes],
				cancelado: [:edit, :destroy, :cancelar, :encaminhar_para_comissao, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes, :arquivo],
				revogado: [:edit, :destroy, :cancelar, :encaminhar_para_comissao, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes, :arquivo],
				adjudicado: [:edit, :destroy, :cancelar, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes, :arquivo],
				desertado: [:edit, :destroy, :cancelar, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes, :arquivo],
				aguardando_parecer_final: [:aguardando_parecer_final, :edit, :destroy, :cancelar, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes, :arquivo],
				aguardando_homologacao: [:edit, :destroy, :cancelar, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes, :arquivo],
				homologado: [:edit, :destroy, :cancelar, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :arquivo],
				fracassado: [:edit, :destroy, :cancelar, :selecionar_dotacao, :adicionar_dotacao, :excluir_dotacao, :editar_licitantes, :atualizar_licitantes, :arquivo],
			}
		end

		if object.instance_of?(Licitacao::Contrato)
			acoes_invalidas = {
				aberto: [],
				fechado: [:edit, :destroy, :cancelar, :editar_itens, :editar_dotacoes, :finalizar, :excluir_dotacao],
				cancelado: [:create,:edit, :destroy, :finalizar, :create, :editar_itens, :editar_dotacoes, :cancelar, :excluir_dotacao],
				enviado_para_controladoria: [:create,:edit,  :finalizar, :create, :editar_itens, :editar_dotacoes, :cancelar, :excluir_dotacao],
				enviado_para_copfin: [:create,:edit,  :finalizar, :create, :editar_itens, :editar_dotacoes, :cancelar, :excluir_dotacao],
				enviado_para_licitacao: [:create,  :finalizar, :create, :editar_itens, :editar_dotacoes, :cancelar, :excluir_dotacao],
				confirmado:[ :create, :editar_itens, :editar_dotacoes, :cancelar, :excluir_dotacao],
				rescindido:[:create,:edit, :destroy, :finalizar, :create, :editar_itens, :editar_dotacoes, :cancelar, :excluir_dotacao],
			}
		end

		if object.instance_of?(Licitacao::OrdemDeCompra)
			acoes_invalidas = {
				aberto: [],
				enviado_para_almoxarifado: [:edit, :destroy, :cancelar],
				recebido_pelo_almoxarifado: [:edit, :destroy, :cancelar],
				recebido_parcialmente_pelo_almoxarifado: [:edit, :destroy, :cancelar],
				recusado_pelo_almoxarifado: [:edit, :destroy, :cancelar],
				devolvido_ao_fornecedor: [:edit, :destroy, :cancelar, :create, :editar_itens, :atualiza_itens, :finalizar],
				devolvido_pelo_almoxarifado: [:edit, :destroy],
				fechado: [:edit, :destroy, :cancelar, :create, :editar_itens, :atualiza_itens, :finalizar],
				cancelado: [:edit, :destroy, :finalizar, :create, :editar_itens, :atualiza_itens, :cancelar],
			}
		end

		if object.instance_of?(Licitacao::DocumentoDoProcesso)
			acoes_invalidas = {
				pendente: [],
				parecer_concluido: [:parecer_concluido],
			}
		end

		status = object.aasm.current_state
		acoes_invalidas[status].exclude?(acao.to_sym)
	end

	def eh_da_fase_de_processo? controller, action
		if controller == 'projetos' && action == 'selecionar_dotacao'
			!@projeto.aberto?
		else
			controllers = ["processos", "publicacoes", "impugnacoes", "lances", "pessoas_do_projeto",  "recursos", "pessoas_do_projeto_do_lote"]
			controllers.include?(controller) ||
			(controller == "documentos_do_processo") && %w[parecer index edita_parecer].exclude?(action) ||
			(controller == "atas_de_registro_de_precos") && @processo ||
			(controller == "contratos") && @processo
		end
	end

	def eh_da_fase_da_acao? controller, action
		controllers = ["acoes"]
		(controllers.include? controller) || controller == "acoes"
	end

	def eh_da_fase_do_pedido? controller, action
		controllers = ["pessoas_do_pedido"]
		(controllers.include? controller) || controller == "pedidos"
	end

	def eh_da_fase_de_projeto? controller, action
		controllers = ['projetos', 'lotes']
		(controllers.include? controller) && (action != 'selecionar_dotacao' || @projeto.aberto?)
	end

	def enviar_email_cotacao_externa pessoa_do_pedido_id, codigo_de_acesso
		pdf = WickedPdf.new.pdf_from_string(
				render_to_string(
					template: "licitacao/pessoas_do_pedido/enviar_email_cotacao_externa.pdf.slim",
					orientation: 'Portrait',
					disable_smart_shrinking: true,

					dpi: '96',
					header: {
						html: {
							template: 'layouts/_cabecalho_pdf.html.slim',
							locals:   {
								titulo1: 'COMPROVANTE DE COTAÇÃO EXTERNA',
								titulo2: ""
							}
						},
						spacing: 5
					}
				)
			)

		PrincipalMailer.cotacao_externa( pdf,pessoa_do_pedido_id ).deliver_now unless Rails.env.development? || Rails.env.test?
	end

	def enviar_email_ordem_de_compra ordem_de_compra_id
		@ordem = Licitacao::OrdemDeCompra.find(ordem_de_compra_id)

		pdf = WickedPdf.new.pdf_from_string(
			render_to_string(
				template: "licitacao/relatorios/ordens_de_compra/ordem_de_compra_anexo_do_email.pdf.slim",
				orientation: 'Portrait',
				dpi: '96'
			)
		)
		Thread.new do
			PrincipalMailer.ordem_de_compra(pdf, @ordem).deliver! unless Rails.env.development? || Rails.env.test?
		end
	end

	def descricao_lote lote
		case lote.processo.forma_de_agrupamento
			when "por_lote" then "Lote Nº #{lote.numero}"
			when "global" then "Lote Global"
			when "por_item" then "#{lote.itens_do_lote.first.item.descricao}"
		end
	end

	def label_botao_proposta pessoa_do_projeto
		"proposta #{pessoa_do_projeto.ganhou_algum_lote? ? "final" : "inicial"}"
	end

	def proposta_final? pessoa_do_projeto
		pessoa_do_projeto.lotes_ganhos_ativos.any? && !pessoa_do_projeto.projeto.por_item?
	end

	def proposta_inicial? pessoa_do_projeto
		!pessoa_do_projeto.projeto.lances_finais_cadastrados? && (pessoa_do_projeto.lotes.ativos.any? || (pessoa_do_projeto.possui_lances_de_lotes_ativos? && pessoa_do_projeto.lotes.ativos.any?) || !pessoa_do_projeto.lotes.any?)
	end

	def botao_proposta pessoa_do_projeto
		if pessoa_do_projeto.projeto.pedido.projeto_simplificado?
			if (pessoa_do_projeto.projeto.processo_licitatorio? || pessoa_do_projeto.projeto.chamamento_publico? || pessoa_do_projeto.projeto.chamada_publica?) && esta_autorizado?(:edit) &&
				pessoa_do_projeto.lotes.all? { |lote| lote.lances_fechados? }
				unless pessoa_do_projeto.proposta_final_prenchida?
					if proposta_final?(pessoa_do_projeto)
						botao(edit_licitacao_pessoa_do_projeto_path(pessoa_do_projeto), class: "btn btn-primary btn-sm", class_icone: "i icone-editar", texto: " Proposta Final")
					elsif proposta_inicial?(pessoa_do_projeto)
						botao(edit_licitacao_pessoa_do_projeto_path(pessoa_do_projeto), class: "btn btn-primary btn-sm", class_icone: "i icone-editar", texto: " Proposta Inicial")
					end
				end
			end
		else
			if (pessoa_do_projeto.projeto.processo_licitatorio? || pessoa_do_projeto.projeto.chamamento_publico? || pessoa_do_projeto.projeto.chamada_publica?) && ( pessoa_do_projeto.projeto.em_sessao? || pessoa_do_projeto.projeto.homologado_parcialmente? ) &&
				esta_autorizado?(:edit) && pessoa_do_projeto.lotes.all? { |lote| lote.lances_fechados? }
				unless pessoa_do_projeto.proposta_final_prenchida?
					if proposta_final?(pessoa_do_projeto)
						botao(edit_licitacao_pessoa_do_projeto_path(pessoa_do_projeto), class: "btn btn-primary btn-sm", class_icone: "i icone-editar", texto: " Proposta Final")
					elsif proposta_inicial?(pessoa_do_projeto)
						botao(edit_licitacao_pessoa_do_projeto_path(pessoa_do_projeto), class: "btn btn-primary btn-sm", class_icone: "i icone-editar", texto: " Proposta Inicial")
					end
				end
			end
		end
	end
end
