# Standard library imports
import uuid

# Django imports
from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _

# Django Rest Framework imports

# Third party imports

# Local imports

user_model = settings.AUTH_USER_MODEL


class IsDeletedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_deleted=False)


class BaseModel(models.Model):
    """
    Tracks instance creations, updates, and (soft) deletions.
    """

    uuid = models.UUIDField(
        verbose_name=_("UUID"), unique=True, default=uuid.uuid4, editable=False
    )

    created_by = models.ForeignKey(
        to=user_model,
        verbose_name=_("Created by"),
        null=True,
        blank=True,
        related_name="%(class)s_created",
        on_delete=models.SET_NULL,
    )

    created_at = models.DateTimeField(
        verbose_name=_("Created at"),
        auto_now_add=True,
        editable=False,
        db_index=True,
    )

    updated_by = models.ForeignKey(
        to=user_model,
        verbose_name=_("Updated by"),
        null=True,
        blank=True,
        related_name="%(class)s_updated",
        on_delete=models.SET_NULL,
    )

    updated_at = models.DateTimeField(
        verbose_name=_("Updated at"),
        auto_now=True,
        null=True,
        blank=True,
    )

    deleted_by = models.ForeignKey(
        to=user_model,
        verbose_name=_("Deleted by"),
        null=True,
        blank=True,
        related_name="%(class)s_deleted",
        on_delete=models.SET_NULL,
    )

    deleted_at = models.DateTimeField(
        verbose_name=_("Deleted at"), null=True, blank=True, default=None
    )

    is_deleted = models.BooleanField(verbose_name=_("Is deleted"), default=False)

    objects = IsDeletedManager()

    objects_all = models.Manager()

    class Meta:
        abstract = True
