from django.db import models
from django.utils import timezone


class ActiveManager(models.Manager):
    class _QS(models.QuerySet):
        def visible_to(self, user):
            from account.models import UserBlock
            author_field = getattr(self.model, 'AUTHOR_FIELD', 'author')

            blocked_ids = UserBlock.objects.filter(blocker=user).values_list('blocked_id', flat=True)
            blocking_ids = UserBlock.objects.filter(blocked=user).values_list('blocker_id', flat=True)

            return (
                self.exclude(**{f'{author_field}__in': blocked_ids})
                    .exclude(**{f'{author_field}__in': blocking_ids})
            )

    def get_queryset(self):
        return self._QS(self.model, using=self._db).filter(is_deleted=False)


class AllManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset()
    
# How to use custom object Managers: add these fields to your model, to override objects behaviour and all_objects behaviour
# objects = ActiveManager()
# all_objects = AllManager()


class SoftDeleteModel(models.Model):
    is_deleted = models.BooleanField(default=False)
    deleted_at = models.DateTimeField(null=True, blank=True)

    objects = ActiveManager()
    all_objects = AllManager()

    class Meta:
        abstract = True

    def delete(self, *args, **kwargs):
        self.is_deleted = True
        self.deleted_at = timezone.now()
        self.save()

    def hard_delete(self, using=None, keep_parents=False):
        super().delete(using=using, keep_parents=keep_parents)