#!/usr/local/bin/python
import sys
from os import path
sys.stdout = sys.stderr
sys.path.append(path.dirname(path.realpath(__file__)))

import cherrypy
from eutils import *
from eutils import _VALUE

class NLPTools(object):

	def __init__(self):
		self.keys = loadConfig(path.join(path.abspath(path.dirname(__file__)), 'config.ini'))
		self.toolList = makeToolMap(self.keys)

	@cherrypy.expose
	@cherrypy.tools.json_in()
	@cherrypy.tools.json_out()
	def booking(self):
		#---------- ETAP 1: Pobieranie przychodzacych danych w formacie JSON ----------
		jsonIncome = cherrypy.request.json
		#---------- ETAP 2: Sprawdzanie poprawnosci danych w formacie JSON ----------
		jsonOutcome = checkJSON(jsonIncome, ['username'])
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		#---------- ETAP 3: Sprawdzanie poprawnosci danych z kontekstu zadania ----------
		jsonOutcome = checkUsername(jsonIncome['username'], self.keys)
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		#---------- ETAP 4: Wykonywanie zadania ----------
		jsonOutcome[_VALUE] = createTaskPath(jsonIncome['username'], self.keys)
		return jsonOutcome

	@cherrypy.expose
	@cherrypy.tools.json_in()
	@cherrypy.tools.json_out()
	def confirmation(self):
		#---------- ETAP 1: Pobieranie przychodzacych danych w formacie JSON ----------
		jsonIncome = cherrypy.request.json
		#---------- ETAP 2: Sprawdzanie poprawnosci danych w formacie JSON ----------
		jsonOutcome = checkJSON(jsonIncome, ['data'])
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome

		(data,) = getValuesFromDict(jsonIncome,'data')

		jsonOutcome = checkJSON(data, ['tool', 'files', 'options'])
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		(tool, files, options) = getValuesFromDict(data, 'tool', 'files', 'options')
		#---------- ETAP 3: Sprawdzanie poprawnosci danych z kontekstu zadania ----------
		jsonOutcome = checkToolname(tool, self.keys)
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome

   		jsonOutcome = checkMultipliePaths(files)
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome

		#---------- ETAP 4: Wykonywanie zadania ----------
		optionPath = generateOptionsFile(path.dirname(files[0]), tool, options)
		jsonOutcome[_VALUE] = generateTokens(files, optionPath, self.keys, tool)
		addTaskToQueue(self.toolList, tool, jsonOutcome)
		return jsonOutcome

	@cherrypy.expose
	@cherrypy.tools.json_in()
	@cherrypy.tools.json_out()
	def checking(self):
		#---------- ETAP 1: Pobieranie przychodzacych danych w formacie JSON ----------
		jsonIncome = cherrypy.request.json
		#---------- ETAP 2: Sprawdzanie poprawnosci danych w formacie JSON ----------
		jsonOutcome = checkJSON(jsonIncome, ['tool', 'token'])
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		(tool, token) = getValuesFromDict(jsonIncome, 'tool', 'token')
		return checkTask(tool, token, self.toolList, self.keys)

	@cherrypy.expose
	@cherrypy.tools.json_in()
	@cherrypy.tools.json_out()
	def reservation(self):
		#---------- ETAP 1: Pobieranie przychodzacych danych w formacie JSON ----------
		jsonIncome = cherrypy.request.json
		#---------- ETAP 2: Sprawdzanie poprawnosci danych w formacie JSON ----------
		jsonOutcome = checkJSON(jsonIncome, ['tool'])
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		(tool,) = getValuesFromDict(jsonIncome, 'tool')
		#---------- ETAP 3: Sprawdzanie poprawnosci danych z kontekstu zadania ----------
		jsonOutcome = checkToolname(tool, self.keys)
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		if not tool in self.toolList:
			addToolToMap(self.toolList, tool, self.keys)
		#---------- ETAP 4: Wykonywanie zadania ---------- 
		return getTask(self.toolList, tool, self.keys)

	@cherrypy.expose
	@cherrypy.tools.json_in()
	@cherrypy.tools.json_out()
	def piloting(self):
		#---------- ETAP 1: Pobieranie przychodzacych danych w formacie JSON ----------
		jsonIncome = cherrypy.request.json
		#---------- ETAP 2: Sprawdzanie poprawnosci danych w formacie JSON ----------
		jsonOutcome = checkJSON(jsonIncome, ['tool'])
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		(tool,) = getValuesFromDict(jsonIncome, 'tool')

		jsonOutcome = checkJSON(jsonIncome, ['command'])
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		(command,) = getValuesFromDict(jsonIncome, 'command')

		#---------- ETAP 3: Sprawdzanie poprawnosci danych z kontekstu zadania ----------
		jsonOutcome = checkToolname(tool, self.keys)
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome

		#---------- ETAP 4: Wykonywanie zadania ----------
		return taskControl(command, self.toolList, tool)

	@cherrypy.expose
	@cherrypy.tools.json_in()
	@cherrypy.tools.json_out()
	def response(self):
		#---------- ETAP 1: Pobieranie przychodzacych danych w formacie JSON ----------
		jsonIncome = cherrypy.request.json
		#---------- ETAP 2: Sprawdzanie poprawnosci danych w formacie JSON ----------
		jsonOutcome = checkJSON(jsonIncome, ['tool', 'task', 'success'])
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		(tool, task, success) = getValuesFromDict(jsonIncome, 'tool', 'task', 'success')
		#---------- ETAP 3: Sprawdzanie poprawnosci danych z kontekstu zadania ----------
		jsonOutcome = checkToolname(tool, self.keys)
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		jsonOutcome = checkTaskInProgress(self.toolList, tool, task)
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		#---------- ETAP 4: Wykonywanie zadania ----------
		if success:
			jsonOutcome = moveTask(self.toolList, tool, task, 'progress', 'done')
		else:
			jsonOutcome = moveTask(self.toolList, tool, task, 'progress', 'error')
		return jsonOutcome

	@cherrypy.expose
	@cherrypy.tools.json_in()
	@cherrypy.tools.json_out()
	def clean(self):
		#---------- ETAP 1: Pobieranie przychodzacych danych w formacie JSON ----------
		jsonIncome = cherrypy.request.json

		#---------- ETAP 2: Sprawdzanie poprawnosci danych w formacie JSON ----------
		jsonOutcome = checkJSON(jsonIncome, ['secret'])
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		(secret, ) = getValuesFromDict(jsonIncome,'secret')
		jsonOutcome = checkSecret(secret)
		if (checkStatusError(jsonOutcome)):
			return jsonOutcome
		else:
			return cleanAll(self.toolList, self.keys)
