from __future__ import absolute_import

from radarsys.celery import app
from celery import task
from datetime import timedelta, datetime

from .models import Experiment

@task
def task_start(id_exp):
    exp = Experiment.objects.get(pk=id_exp)
    status = exp.status
    if exp.status == 2:
        print('Experiment {} already running start task not executed'.format(exp))
        return 2
    if status == 3:
        now = datetime.now()
        start = datetime.combine(now.date(), exp.start_time)
        end = datetime.combine(now.date(), exp.end_time)
        if end < start:
            end += timedelta(1)
        try:
            print('Starting exp:{}'.format(exp))
            exp.status = exp.start()
        except:
            print('Error')
            exp.status = 0
        if exp.status == 2:
            task = task_stop.apply_async((id_exp,), eta=end+timedelta(hours=5))
            exp.task = task.id
    exp.save()
    return exp.status

@task
def task_stop(id_exp):
    exp = Experiment.objects.get(pk=id_exp)
    if exp.status == 2:
        try:
            print('Stopping exp:{}'.format(exp))
            exp.status = exp.stop()
        except:
            print('Error')
            exp.status = 0

    now = datetime.now()
    start = datetime.combine(now.date()+timedelta(1), exp.start_time)
    task = task_start.apply_async((id_exp, ), eta=start+timedelta(hours=5))
    exp.task = task.id
    exp.status = 3
    exp.save()
    return exp.status

#Task to get status
@task
def task_status(id_exp):

    exp = Experiment.objects.get(pk=id_exp)
    if exp.status==2:
        run_every = timedelta(minutes=1)
        now = datetime.utcnow()
        date = now + run_every
        task_status.apply_async((id_exp,), eta=date)
        print ("Monitoring...")
        exp.get_status()
        return exp.status

    else:
        return exp.status
