#!/usr/bin/env python

#
# Implementation for experiment session controller.
#

import time

from dm.common.objects.experiment import Experiment
from dm.common.objects.dmObjectManager import DmObjectManager
from dm.common.exceptions.invalidRequest import InvalidRequest
from dm.common.db.api.experimentDbApi import ExperimentDbApi
from dm.ds_web_service.service.impl.experimentManager import ExperimentManager

class ExperimentSessionControllerImpl(DmObjectManager):
    """ Experiment session controller implementation class. """

    def __init__(self):
        DmObjectManager.__init__(self)
        self.experimentDbApi = ExperimentDbApi()

    def getExperimentTypes(self):
        experimentTypeList = self.experimentDbApi.getExperimentTypes()
        return experimentTypeList

    def getExperiments(self):
        experimentList = self.experimentDbApi.getExperiments()
        return experimentList

    def getExperimentsByStation(self, stationName):
        experimentList = self.experimentDbApi.getExperimentsByStation(stationName)
        return experimentList

    def getExperimentByName(self, name):
        experiment = self.experimentDbApi.getExperimentWithUsers(name)
        ExperimentManager.getInstance().updateExperimentWithStorageDataDirectory(experiment)
        return experiment

    def getExperimentById(self, id):
        experiment = self.experimentDbApi.getExperimentById(id)
        ExperimentManager.getInstance().updateExperimentWithStorageDataDirectory(experiment)
        return experiment

    def addExperiment(self, name, stationName, typeId, description, startDate, endDate):
        experiment = self.experimentDbApi.addExperiment(name, stationName, typeId, description, startDate, endDate)
        ExperimentManager.getInstance().createExperimentDataDirectory(experiment)
        return experiment

    def startExperiment(self, experiment):
        experiment2 = self.experimentDbApi.setExperimentStartDateToNow(experiment['name'])
        experiment['startDate'] = experiment2['startDate']
        return experiment

    def updateExperiment(self, experiment):
        ExperimentManager.getInstance().updateExperimentGroupUsers(experiment)
        return experiment

    def stopExperiment(self, experiment):
        experiment = self.experimentDbApi.setExperimentEndDateToNow(experiment['name'])
        ExperimentManager.getInstance().updateExperimentWithStorageDataDirectory(experiment)
        return experiment

    def authorizeDownload(self, username, experiment):
        return ExperimentManager.getInstance().authorizeDownload(username, experiment)

    def deauthorizeDownload(self, username, experiment):
        return ExperimentManager.getInstance().deauthorizeDownload(username, experiment)