from django.conf import settings
from django.db import models


class Task(models.Model):
    STATUSES = [("todo", "todo"), ("in_progress", "in_progress"), ("review", "review"), ("done", "done")]
    PRIORITIES = [("low", "low"), ("normal", "normal"), ("high", "high")]
    # quality of the finished work, given by an approver: excellent / good / average / poor / terrible
    QUALITIES = [("excellent", "excellent"), ("good", "good"), ("average", "average"), ("poor", "poor"), ("terrible", "terrible")]

    organization = models.ForeignKey("organizations.Organization", on_delete=models.CASCADE, related_name="tasks")
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True, default="")
    status = models.CharField(max_length=20, choices=STATUSES, default="todo")
    priority = models.CharField(max_length=10, choices=PRIORITIES, default="normal")
    due_date = models.DateField(null=True, blank=True)
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name="tasks_created"
    )
    assignee = models.ForeignKey(
        settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="tasks_assigned"
    )
    assigned_at = models.DateTimeField(null=True, blank=True)
    assignee_seen_at = models.DateTimeField(null=True, blank=True)  # null while the assignee has not opened it
    review_note = models.CharField(max_length=500, blank=True, default="")
    reviewed_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="+")
    reviewed_at = models.DateTimeField(null=True, blank=True)  # when the task was approved / finished
    quality = models.CharField(max_length=10, choices=QUALITIES, blank=True, default="")
    rated_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="+")
    rated_at = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["-created_at", "-id"]
        indexes = [models.Index(fields=["organization", "status"])]
