from django.db import models

# Create your models here.
from django.contrib.postgres.fields import DateRangeField
from django.conf import settings

from generic.models import Site
from django.core.validators import MaxValueValidator, MinValueValidator

class OutOfProgrameEvent(models.Model):
    date_range = DateRangeField(help_text="The range of the out of programe event")
    end_date = models.DateField()
    reason = models.CharField(max_length=255)

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class LeaveRequest(models.Model):
    date_range = DateRangeField(help_text="The range of the leave request")

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    LEAVE_STATUS = (
        ("UNDECIDED", "Undecided"),
        ("REJECTED", "Rejected" ),
        ("ACCEPTED", "Accepted" )
    )

    status = models.CharField(max_length=10, choices=LEAVE_STATUS, default="UNDECIDED")

    reason = models.CharField(max_length=255)

    def __str__(self) -> str:
        return f"{self.date_range} / {self.reason} / {self.status}"

class MultiLeaveRequest(models.Model):
    date_range = DateRangeField(help_text="The range of the leave request")

    users = models.ManyToManyField(settings.AUTH_USER_MODEL)

    reason = models.CharField(max_length=255)

    def __str__(self) -> str:
        return f"{self.date_range} / {self.reason}"

class RotaRotation(models.Model):
    name = models.CharField(max_length=100, help_text="Name of the rotation")

    def __str__(self):
        return self.name
    

class Rota(models.Model):
    start_date = models.DateField(help_text="The rota start date")
    weeks_to_rota = models.IntegerField(default=26, help_text="The number of (whole) weeks the rota cycle runs for")

    rotations = models.ManyToManyField(RotaRotation, help_text="The rotations that are in the rota")

    def __str__(self):
        return f"{self.start_date} : {self.weeks_to_rota} weeks"
    

class UserRotaDetail(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    rotation = models.ForeignKey(RotaRotation, on_delete=models.SET_NULL, null=True)

    proc_site = models.ForeignKey(Site, on_delete=models.SET_NULL, null=True)

    end_date = models.DateField(blank=True, null=True, help_text="The date the user should be roted up until, for example their CCT date")
    start_date = models.DateField(blank=True, null=True, help_text="The date the user should be roted from, for example if they join part way through a rota cycle")

    full_time_equivalence = models.IntegerField(default=100, validators=[MaxValueValidator(100), MinValueValidator(0)], help_text="Percentage of FTE, 100 = Full Time")
    
    nwd_monday = models.BooleanField(default=False)
    nwd_tuesday = models.BooleanField(default=False)
    nwd_wednesday = models.BooleanField(default=False)
    nwd_thursday = models.BooleanField(default=False)
    nwd_friday = models.BooleanField(default=False)


