import datetime
import uuid
from django.db import models
from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy as _

from main.fields import WEBPField
# Create your models here.

User = get_user_model()

CHECK_BOOLEAN = [
    (True,_("submitted")),
    (False,_("ignored")),
]

ACTIVE_BOOLEAN = [
    (True,_("active")),
    (False,_("deactive")),
]

QUESTION_BOOLEAN = [
    (True,_("yes")),
    (False,_("no")),
]


def image_master_folder(instance, filename):
    return f'master/{instance.user.username}/{uuid.uuid4().hex}.webp'



class Department(models.Model):
    name = models.CharField(_("name"),max_length=150)
    slug = models.SlugField(_("slug"),max_length=150)
    is_active = models.BooleanField(_("is active"), default=True, choices=ACTIVE_BOOLEAN)
    parent = models.ForeignKey("self", verbose_name=_("parent department"), related_name="sub_department", on_delete=models.RESTRICT, null=True, blank=True)
    
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = _("Department")
        verbose_name_plural = _("Department")
        ordering = ['-id']



class AllowIp(models.Model):
    ip = models.GenericIPAddressField(_("User Ip"), default="0.0.0.0", protocol="both", unpack_ipv4=False)
    is_active = models.BooleanField(_("is active"),default=True, choices=ACTIVE_BOOLEAN)

    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return self.ip


    class Meta:
        verbose_name = _("Allow Ip")
        verbose_name_plural = _("Allow Ip")
        ordering = ['-id']



class Master(models.Model):
    user = models.OneToOneField(User, on_delete=models.RESTRICT, verbose_name=_("user"), related_name="master")
    nickname = models.CharField(_("nickName"), max_length=50, default="Admin")
    is_active = models.BooleanField(_("is active"),default=True, choices=ACTIVE_BOOLEAN)
    
    mobile = models.CharField(_("mobile"), max_length=12,null=True, blank=True)
    otp_code = models.CharField(_("otp code"), max_length=10,null=True, blank=True) 
    otp_time = models.FloatField(_("send code time"), null=True, blank=True)

    super_master = models.BooleanField(_("super master"), default=False)
    image = WEBPField(_("image"), upload_to=image_master_folder, default="blank/blank-profile.png", blank=True)

    department = models.ManyToManyField(Department,verbose_name=_("Department"), related_name="master", blank=True)

    ip = models.ManyToManyField(AllowIp, related_name="master_ip", verbose_name=_("Allowed IP"), blank=True)

    incorrect_num = models.SmallIntegerField(_("incorrect password num"), default=0)
    incorrect_time = models.FloatField(_("last incorrect password time"), default=0)

    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def save(self, **kwargs):
        
        return super().save()

    def __str__(self):
        if self.user is not None:
            return self.user.get_full_name()
        else:
            return "manager"

    @property
    def support_name(self):
        if self.nickname is None:
            return self.user.get_full_name()
        return self.nickname


    class Meta:
        verbose_name = _("Master")
        verbose_name_plural = _("Master")
        ordering = ['-id']


class LoginLog(models.Model):
    user = models.ForeignKey(User, on_delete=models.RESTRICT, related_name='login_log', verbose_name=_("user"))
    ip = models.GenericIPAddressField(_("User Ip"), default="0.0.0.0", protocol="both", unpack_ipv4=False)
    is_success = models.BooleanField(_("is Success"), default=True)
    failure = models.CharField(_("failure Reason"), max_length=250, null=True, blank=True)

    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return f"{self.user.username}"
    
    class Meta:
        verbose_name = _('Login Log')
        verbose_name_plural = _('Login Log')
        ordering = ['-id']


class UserLog(models.Model):
    user = models.ForeignKey(User, on_delete=models.RESTRICT, verbose_name=_("user"), related_name="user_log")
    for_user = models.ForeignKey(User, on_delete=models.RESTRICT, verbose_name=_("for User"), related_name="user_log_changed", null=True, blank=True)
    desc = models.TextField(_("description"))
    ip = models.GenericIPAddressField(_("User Ip"), default="0.0.0.0", protocol="both", unpack_ipv4=False)
    model = models.CharField(_("model"), max_length=500, null=True, blank=True)
    record_id = models.CharField(_("record ID"), max_length=500, null=True, blank=True)
    change = models.TextField(_("changes"), null=True,blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    class Meta:
        verbose_name = _("User Log")
        verbose_name_plural = _("User Log")
        ordering = ['-id']

    def __str__(self):
        return f"{self.user.get_full_name()} -> {self.model}"
