#!/usr/bin/env python

import cherrypy
import json
from dm.common.utility.encoder import Encoder
from dm.common.service.dmSessionController import DmSessionController
from dm.cat_web_service.service.impl.fileSessionControllerImpl import FileSessionControllerImpl

class FileSessionController(DmSessionController):

    def __init__(self):
        DmSessionController.__init__(self)
        self.fileSessionControllerImpl = FileSessionControllerImpl()

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.canManageStation())
    @DmSessionController.execute
    def addExperimentFile(self, experimentName, encodedExperimentFilePath, **kwargs):
        if not experimentName:
            raise InvalidRequest('Invalid experiment name provided.')
        experimentFilePath = Encoder.decode(encodedExperimentFilePath)
        if not experimentFilePath:
            raise InvalidRequest('Invalid experiment file path provided.')
        encodedFileInfo = kwargs.get('fileInfo')
        if not encodedFileInfo:
            raise InvalidRequest('Invalid file info provided.')
        fileInfo = json.loads(Encoder.decode(encodedFileInfo))
        fileInfo['experimentFilePath'] = experimentFilePath
        fileInfo['experimentName'] = experimentName
        response = self.fileSessionControllerImpl.addExperimentFile(fileInfo).getFullJsonRep()
        self.logger.debug('Added file %s: %s' % (experimentFilePath,response))
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.canManageStation())
    @DmSessionController.execute
    def updateExperimentFile(self, experimentName, encodedExperimentFilePath, **kwargs):
        if not experimentName:
            raise InvalidRequest('Invalid experiment name provided.')
        experimentFilePath = Encoder.decode(encodedExperimentFilePath)
        if not experimentFilePath:
            raise InvalidRequest('Invalid experiment file path provided.')
        encodedFileInfo = kwargs.get('fileInfo')
        if not encodedFileInfo:
            raise InvalidRequest('Invalid file info provided.')
        fileInfo = json.loads(Encoder.decode(encodedFileInfo))
        fileInfo['experimentFilePath'] = experimentFilePath
        fileInfo['experimentName'] = experimentName
        response = self.fileSessionControllerImpl.updateExperimentFile(fileInfo).getFullJsonRep()
        self.logger.debug('Updated file %s: %s' % (experimentFilePath,response))
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.canManageStation())
    @DmSessionController.execute
    def updateExperimentFileById(self, expermentName, id, **kwargs):
        if not experimentName:
            raise InvalidRequest('Invalid experiment name provided.')
        if not id:
            raise InvalidRequest('Invalid file id provided.')
        encodedFileInfo = kwargs.get('fileInfo')
        if not encodedFileInfo:
            raise InvalidRequest('Invalid file info provided.')
        fileInfo = json.loads(Encoder.decode(encodedFileInfo))
        fileInfo['experimentName'] = experimentName
        response = self.fileSessionControllerImpl.updateExperimentFileById(fileInfo).getFullJsonRep()
        self.logger.debug('Updated file id %s: %s' % (id,response))
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.canManageStation())
    @DmSessionController.execute
    def getExperimentFiles(self, experimentName, **kwargs):
        if not experimentName:
            raise InvalidRequest('Invalid experiment name provided.')
        encodedQueryDict = kwargs.get('queryDict')
        queryDict = {}
        if encodedQueryDict:
            queryDict = json.loads(Encoder.decode(encodedQueryDict))
        return self.listToJson(self.fileSessionControllerImpl.getExperimentFiles(experimentName, queryDict=queryDict))

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.canManageStation())
    @DmSessionController.execute
    def getExperimentFileById(self, experimentName, id, **kwargs):
        if not experimentName:
            raise InvalidRequest('Invalid experiment name provided.')
        if not id:
            raise InvalidRequest('Invalid id provided.')
        response = self.fileSessionControllerImpl.getExperimentFileById(experimentName, id).getFullJsonRep()
        self.logger.debug('Returning file id %s: %s' % (id,response))
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.canManageStation())
    @DmSessionController.execute
    def getExperimentFile(self, experimentName, encodedExperimentFilePath, **kwargs):
        if not experimentName:
            raise InvalidRequest('Invalid experiment name provided.')
        experimentFilePath = Encoder.decode(encodedExperimentFilePath)
        if not experimentFilePath:
            raise InvalidRequest('Invalid experiment file path provided.')
        response = self.fileSessionControllerImpl.getExperimentFile(experimentName, experimentFilePath).getFullJsonRep()
        self.logger.debug('Returning file %s: %s' % (experimentFilePath,response))
        return response