from django.db import models
from django.urls import reverse
from django.utils.timezone import datetime
from django.db.models import Sum

# constants
datetime_format_string = '%Y-%m-%dT%H:%M:%SZ'

class Workflow(models.Model):
    repository = models.CharField(max_length=100, blank=True, null=True, default="unknown")
    commit_id = models.CharField(max_length=30, blank=True, null=True)
    path = models.CharField(max_length=100, blank=True, null=True, default="unknown")

class LogEntry(models.Model):
    step_name = models.CharField(max_length=30, blank=True, null=True, default="unknown")


class Task(models.Model):
    taskID = models.CharField(db_index=True, max_length=30, blank=True, null=True)
    task_type = models.CharField(max_length=20, default="task")

    project = models.CharField(max_length=100, blank=True, null=True, default="unknown")
    sas_id = models.CharField(max_length=30, blank=True, null=True)
    priority = models.IntegerField(default=0)
    purge_policy = models.CharField(max_length=5, default="no", blank=True, null=True)
    workflow_id = models.CharField(max_length=12, blank=True, null=True)

    inputs = models.JSONField(null=True, blank=True)
    outputs = models.JSONField(null=True, blank=True)

    skip = models.BooleanField(default=False)
    creationTime = models.DateTimeField(default=datetime.utcnow, blank=True)

    new_status = models.CharField(max_length=50, default="defined", null=True)
    my_status = models.CharField(db_index=True, max_length=50,default="defined")


    def __str__(self):
        return str(self.id)

    # this translates a view-name (from urls.py) back to a url, to avoid hardcoded url's in the html templates
    # bad : <td><a href="/atdb/observations/{{ observation.id }}/" target="_blank">{{ observation.taskID }} </a> </td>
    # good: <td><a href="{{ observation.get_absolute_url }}" target="_blank">{{ observation.taskID }} </a> </td>
    def get_absolute_url(self):
        return reverse('task-detail-view-api', kwargs={'pk': self.pk})


class Status(models.Model):
    name = models.CharField(max_length=50, default="unknown")
    timestamp = models.DateTimeField(default=datetime.utcnow, blank=True)
    task = models.ForeignKey(Task, related_name='status_history', on_delete=models.CASCADE, null=False)

    @property
    def property_taskID(self):
        return self.task.taskID

    @property
    def property_task_type(self):
        return self.task.task_type

    # the representation of the value in the REST API
    def __str__(self):
        formatedDate = self.timestamp.strftime(datetime_format_string)
        return str(self.name)+' ('+str(formatedDate)+')'