from django.db import models
from django.conf import settings
from django.contrib.auth.models import AbstractUser

from core.utils.file_rename import UploadPathAndRename
from core.custom_validation import validate_file_size

from common.base_models import BaseModel

from apps.user.managers.user_manager import UserManager
from apps.project.models import Project

from imagekit.processors import ResizeToFill
from imagekit.models import ProcessedImageField



class User(AbstractUser):
    username = None
    email = models.EmailField(null=True)
    phone_no = models.CharField(max_length=30)
    profile_pic = models.ImageField(null=True, upload_to=UploadPathAndRename('user/{instance.id}/profile_pic/'), default='user_priofile_pic.jpg', validators=[validate_file_size])
    profile_pic_thumb = ProcessedImageField(null=True, upload_to=UploadPathAndRename('user/{instance.id}/profile_pic/thumb/'),
                                        processors=[ResizeToFill(100, 100)], format='JPEG', options={'quality': 60}, default='user_thumb.jpg',
                                        validators=[validate_file_size])
    role = models.ForeignKey(
        "user.Role", on_delete=models.CASCADE, null=True, blank=True)
    pay_per_hour = models.FloatField(null=True)
    projects = models.ManyToManyField(Project, related_name='project_employees', blank=True)
    position = models.CharField(null=True, max_length=255, blank=True)
    deleted_by = models.ForeignKey(to=settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL,)
    deleted_at = models.DateTimeField(null=True, blank=True, default=None)

    objects = UserManager()

    USERNAME_FIELD = 'phone_no'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.phone_no or self.email
    class Meta:
        db_table = 'users'


class Role(BaseModel):
    name = models.CharField(max_length=150, null=True, blank=True)
    display_name = models.CharField(max_length=150, null=True, blank=True)
    is_system_generated = models.BooleanField(default=False)
    short_description = models.CharField(max_length=150, null=True, blank=True)
    permissions = models.ManyToManyField(
        "user.Permission",
        blank=True,
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'roles'


class Permission(BaseModel):
    name = models.CharField(max_length=150, null=True)

    def __str__(self):
        return f"{self.name}"

    class Meta:
        db_table = "permissions"
