import uuid
from typing import Collection

from django.db.models import BooleanField, Model, UUIDField
from django.utils.translation import gettext_lazy as _
from django_extensions.db.fields import CreationDateTimeField, ModificationDateTimeField


class NiceModel(Model):
    id: None = None
    uuid = UUIDField(
        verbose_name=_("unique id"),
        help_text=_("unique id is used to surely identify any database object"),
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )
    is_active = BooleanField(
        default=True,
        verbose_name=_("is active"),
        help_text=_("if set to false, this object can't be seen by users without needed permission"),
    )
    created = CreationDateTimeField(_("created"), help_text=_("when the object first appeared on the database"))  # type: ignore [no-untyped-call]
    modified = ModificationDateTimeField(_("modified"), help_text=_("when the object was last modified"))  # type: ignore [no-untyped-call]

    def save(  # type: ignore [override]
        self,
        *,
        force_insert: bool = False,
        force_update: bool = False,
        using: str | None = None,
        update_fields: Collection[str] | None = None,
        update_modified: bool = True,
    ) -> None:
        self.update_modified = update_modified
        return super().save(
            force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields
        )

    class Meta:
        abstract = True
        get_latest_by = "modified"
