from django.db import models
from django.utils.text import slugify
from django.db.models.signals import pre_save
from django.utils.timezone import now

# Create your models here.
class Instance(models.Model):
    instance_name = models.CharField(max_length=255)
    responsible_person = models.CharField(max_length=255)
    phone_number = models.CharField(max_length=20)
    instance_alias = models.CharField(max_length=255, blank=True, null=True)

class Element(models.Model):
    code = models.CharField(max_length=10)
    roman_number = models.CharField(max_length=10)
    description = models.TextField()

class Link(models.Model):
    instance = models.ForeignKey(Instance, on_delete=models.CASCADE, related_name='instance')
    element = models.ForeignKey(Element, on_delete=models.CASCADE, related_name='element')
    original_url = models.URLField(max_length=2000)
    short_code = models.CharField(max_length=10)
    created_at = models.DateTimeField(auto_now_add=True)

class PpsForms(models.Model):
    activity = models.TextField()
    improvement_plan = models.TextField()
    achievement_indicator = models.TextField()
    overview = models.TextField()
    completion_time = models.DateTimeField(auto_now_add=True)
    funding_source = models.CharField(max_length=255)
    responsible_person = models.CharField(max_length=255)
    link = models.ForeignKey(Link, on_delete=models.CASCADE, related_name='link', null=True, blank=True)

class Reservation(models.Model):
    STATUS_CHOICES = [
        ('Pending', 'Pending'),
        ('Approved', 'Approved'),
        ('Rejected', 'Rejected'),
        ('Canceled', 'Canceled'),
    ]
    
    banner = models.ImageField(upload_to='reservations/banners/', blank=True, null=True)
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)
    slug = models.SlugField(unique=True, blank=True)
    year = models.PositiveIntegerField()
    month = models.PositiveIntegerField()
    start_date = models.DateField()
    finish_date = models.DateField()
    clock_start = models.TimeField(auto_now=False, auto_now_add=False)
    clock_end = models.TimeField(auto_now=False, auto_now_add=False)
    responsible_person = models.CharField(max_length=255)
    person_count = models.PositiveIntegerField()
    phone_number = models.CharField(max_length=20)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='Pending')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

# Function to generate slug before saving
def generate_slug(instance, new_slug=None):
    slug = slugify(instance.title)
    if new_slug is not None:
        slug = new_slug
    qs = Reservation.objects.filter(slug=slug).exclude(id=instance.id)
    if qs.exists():
        new_slug = f"{slug}-{qs.count()}"
        return generate_slug(instance, new_slug=new_slug)
    return slug

# Signal to set slug before saving the model
def pre_save_reservation_receiver(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = generate_slug(instance)

pre_save.connect(pre_save_reservation_receiver, sender=Reservation)


