import uuid
import datetime
from django.db import models
from django.utils import timezone
from django.contrib.postgres.fields import ArrayField
from authenticate.models import User
from institute.models import Institute
from utils.utils import logs_adder
from collaborators import conf as collaborators_conf


class Access(models.Model):
    """
    This class is responsible for creating Access table in database
    all attributes and methods of Access should defines in this class.
    """
    id = models.UUIDField(primary_key=True, unique=True, db_index=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE, db_index=True)
    institute = models.ForeignKey(Institute, on_delete=models.CASCADE, db_index=True)
    roles = ArrayField(models.CharField(max_length=100), default=list, db_index=True)
    institute_name = models.CharField(max_length=100, db_index=True)
    institute_created_at = models.DateTimeField(default=timezone.now, db_index=True)
    created_at = models.DateTimeField(auto_now_add=True, db_index=True)
    modified_at = models.DateTimeField(auto_now=True, db_index=True)

    class Meta:
        constraints = [models.UniqueConstraint(fields=['user', 'institute'], name='user_and_institute_unique')]





class InviteAccess(models.Model):
    """
    This class is responsible for creating InviteAccess table in database
    all attributes and methods of InviteAccess should defines in this class.
    """
    id = models.UUIDField(primary_key=True, unique=True, db_index=True, default=uuid.uuid4, editable=False)
    modifire = models.ForeignKey(User, on_delete=models.CASCADE, related_name='modifire', db_index=True)
    invited_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='invited_user', null=True, blank=True, db_index=True)
    invited_phone = models.CharField(max_length=15, null=True, blank=True, db_index=True)
    invited_email = models.CharField(max_length=254, null=True, blank=True, db_index=True)
    institute = models.ForeignKey(Institute, on_delete=models.CASCADE, db_index=True)
    roles = ArrayField(models.CharField(max_length=100), default=list)
    rejected = models.BooleanField(default=False,db_index=True)
    canceled = models.BooleanField(default=False,db_index=True)
    created_at = models.DateTimeField(auto_now_add=True, db_index=True)
    modified_at = models.DateTimeField(auto_now=True, db_index=True)


    @staticmethod
    def cleanup_past_invite_access():
        invite_accesses = InviteAccess.objects.filter(
            created_at__lt=timezone.now() - datetime.timedelta(days=collaborators_conf.invite_access_cleanup_offset_days))
        invite_accesses_count = invite_accesses.count()
        invite_accesses.delete()
        logs_adder(f'Event: SCHEDULE, cleanup, InviteAccess, {invite_accesses_count}')
