from django.conf import settings
from django.db import models
from django.utils import timezone
import secrets
from datetime import timedelta

def generate_token():
    return secrets.token_hex(20)

class AccessToken(models.Model):

    SYSTEM_TYPE_TO_CODE = {
        "main": 1, # timetabler
        "medical": 2,
    }
    # Token string as PK (optional: can also use id + token as unique)
    token = models.CharField(
        max_length=40,
        unique=True,
        default=generate_token, # when call .create, will auto generate token by calling generate_token function, so no need add by self
        editable=False
    )

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, # link to which table
        related_name='access_token', # when have user object, can call user.access_token.all() to get access_token table data
        on_delete=models.CASCADE
    )

    type = models.CharField(
        max_length=20,
        choices=[('web', 'Web'), ('mobile_app', 'Mobile App')]
    )
    device = models.CharField(max_length=255, blank=True, null=True)
    system_type = models.SmallIntegerField(default=SYSTEM_TYPE_TO_CODE['main'],null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    expires_at = models.DateTimeField(null=True, blank=True)

    objects = models.Manager()

    class Meta:
        db_table = 'access_token'  # Explicit table name
        unique_together = ('user', 'type', 'device', 'system_type')  # Prevent duplicate tokens

    def __str__(self):
        return f"{self.user} - {self.type} ({self.device or 'unknown'})"

    def is_expired(self):
        """Check if token is expired."""
        return self.expires_at and self.expires_at <= timezone.now()

    def extend_expiry(self, minutes=5):
        """Extend expiry time if not expired."""
        if not self.is_expired():
            self.expires_at = timezone.now() + timedelta(minutes=minutes)
            self.save()