from django.db import models
import uuid
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.hashers import make_password
from .manager import UserManager
from django.conf import settings
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from django.utils import timezone
from datetime import timedelta
from .constants import STAFF_ROLES


class CustomUsersPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = "page_size"
    max_page_size = 100

    def get_paginated_response(self, data):
        return Response(
            {
                "count": self.page.paginator.count,
                "next": self.get_next_link(),
                "previous": self.get_previous_link(),
                "results": data,
            }
        )


# Create your models here.
class Users(AbstractUser):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    email = models.EmailField(unique=True)
    mobile_number = models.CharField(max_length=255, null=True, blank=True)
    birthdate = models.DateTimeField(null=True, blank=True)
    company = models.CharField(max_length=255, null=True, blank=True)
    office_address = models.TextField(null=True, blank=True)
    company_website = models.TextField(null=True, blank=True)
    password = models.CharField(blank=True, null=True)
    how_did_you_know = models.TextField(null=True, blank=True)
    touchpoint = models.CharField(max_length=500, null=True, blank=True)
    brand = models.CharField(max_length=255, null=True, blank=True)
    is_approved = models.BooleanField(default=None, null=True, blank=True)
    reset_password_token = models.CharField(max_length=255, null=True, blank=True)
    role = models.CharField(max_length=500, default="user")

    date_joined = None
    last_login = None
    username = None
    groups = None
    user_permissions = None

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        if self.is_staff or self.is_superuser:
            status = "Administrator"
        else:
            status = "User"

        return f"{self.email} - {status} - {self.role}"

    def save(self, *args, **kwargs):
        if self.password:
            hash_prefix = settings.ALLOWED_HASHED_PREFIX

            if not self.password.startswith(hash_prefix):
                self.password = make_password(self.password)

        self.role = self.role.title()

        if self.role.title() in STAFF_ROLES:
            self.is_staff = True
            self.is_approved = True

            if self.role.title() == "Superuser":
                self.is_superuser = True
        else:
            if self.is_approved:
                self.role = "Designer"

        super(Users, self).save(*args, **kwargs)

    @classmethod
    def hash_plain_password(cls, plain_password):
        return make_password(plain_password)


class UserInvitation(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    invitee = models.ForeignKey(
        Users, on_delete=models.CASCADE, related_name="invited_user"
    )
    invitor_email = models.CharField(max_length=525)
    invitation_link = models.TextField()
    expires_at = models.DateTimeField(null=True, blank=True)

    def __str__(self):
        return f"{self.invitee.email} - Invited by {self.invitor_email}"

    def save(self, *args, **kwargs):
        if not self.expires_at:
            self.expires_at = timezone.now() + timedelta(hours=1)

        super(UserInvitation, self).save()

    @property
    def is_expired(self):
        return timezone.now() > self.expires_at
