#!/usr/bin/env python

import cherrypy
import json

from dm.common.service.dmSessionController import DmSessionController
from dm.common.exceptions.invalidRequest import InvalidRequest
from dm.common.exceptions.authorizationError import AuthorizationError 
from dm.common.db.api.experimentDbApi import ExperimentDbApi
from dm.common.utility.encoder import Encoder

from dm.ds_web_service.service.impl.fileSessionControllerImpl import FileSessionControllerImpl


class FileSessionController(DmSessionController):

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

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    @DmSessionController.execute
    def processFile(self, **kwargs):
        encodedFileInfo = kwargs.get('fileInfo')
        if not encodedFileInfo:
            raise InvalidRequest('Invalid file info provided.')
        fileInfo = json.loads(Encoder.decode(encodedFileInfo))

        if not fileInfo.has_key('experimentFilePath'):
            raise InvalidRequest('Experiment file path is missing.')
        if not fileInfo.has_key('experimentName'):
            raise InvalidRequest('Experiment name is missing.')
        response = self.fileSessionControllerImpl.processFile(fileInfo).getFullJsonRep()
        self.logger.debug('Processed file: %s' % response)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def statFile(self, **kwargs):
        encodedFileInfo = kwargs.get('fileInfo')
        if not encodedFileInfo:
            raise InvalidRequest('Invalid file info provided.')
        fileInfo = json.loads(Encoder.decode(encodedFileInfo))

        if not fileInfo.has_key('experimentFilePath'):
            raise InvalidRequest('Experiment file path is missing.')
        experimentName = fileInfo.get('experimentName')
        if not experimentName:
            raise InvalidRequest('Experiment name is missing.')
        experiment = self.experimentDbApi.getExperimentByName(experimentName)
        if not self.hasAdministratorRole() and not self.hasManagerRole(experiment['experimentStationId']):
            raise AuthorizationError('User %s cannot stat file for experiment %s.' % (self.getSessionUsername(),experimentName))
        response = self.fileSessionControllerImpl.statFile(fileInfo, experiment).getFullJsonRep()
        self.logger.debug('File stat: %s' % response)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    @DmSessionController.execute
    def processDirectory(self, **kwargs):
        encodedDirectoryInfo = kwargs.get('directoryInfo')
        if not encodedDirectoryInfo:
            raise InvalidRequest('Invalid directory info provided.')
        directoryInfo = json.loads(Encoder.decode(encodedDirectoryInfo))

        if not directoryInfo.has_key('experimentName'):
            raise InvalidRequest('Experiment name is missing.')
        response = self.fileSessionControllerImpl.processDirectory(directoryInfo).getFullJsonRep()
        self.logger.debug('Processed directory: %s' % response)
        return response