#!/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 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, experimentTypeId, description):
        experiment = self.experimentDbApi.addExperiment(name, experimentTypeId, description)
        return experiment

    def startExperiment(self, name):
        experiment = self.experimentDbApi.getExperimentWithUsers(name)
        if experiment.get('startDate') is None:
            experiment2 = self.experimentDbApi.setExperimentStartDateToNow(name)
            experiment['startDate'] = experiment2['startDate']
        ExperimentManager.getInstance().createExperimentDataDirectory(experiment)
        return experiment

    def stopExperiment(self, name):
        experiment = self.experimentDbApi.getExperimentByName(name)
        if experiment.get('endDate') is None:
            experiment = self.experimentDbApi.setExperimentEndDateToNow(name)
        ExperimentManager.getInstance().updateExperimentWithStorageDataDirectory(experiment)
        return experiment