"""
TenantManager — a custom Django model Manager that automatically filters
all querysets by the current tenant.

Usage in any multi-tenant model:

    class PortfolioItem(models.Model):
        tenant  = models.ForeignKey(Tenant, ...)
        objects = TenantManager()      # replaces default manager
        ...

Then in views:

    items = PortfolioItem.objects.for_tenant(request.tenant).filter(...)

Or, once a thread-local tenant is set (set_current_tenant), plain .all()
also respects it:

    PortfolioItem.objects.all()  →  filtered by current tenant

Thread-local is set in TenantMiddleware so you almost never need to call
set_current_tenant() yourself.
"""
import threading
from django.db import models

_thread_local = threading.local()


def set_current_tenant(tenant):
    _thread_local.tenant = tenant


def get_current_tenant():
    return getattr(_thread_local, 'tenant', None)


def clear_current_tenant():
    _thread_local.tenant = None


class TenantQuerySet(models.QuerySet):
    def for_tenant(self, tenant):
        """Explicit tenant filter — use this in views for clarity."""
        if tenant is None:
            return self.none()
        if hasattr(tenant, 'pk') and tenant.pk == 0:
            # Dev placeholder tenant — return everything
            return self
        return self.filter(tenant=tenant)


class TenantManager(models.Manager):
    def get_queryset(self):
        qs = TenantQuerySet(self.model, using=self._db)
        tenant = get_current_tenant()
        if tenant is not None:
            if hasattr(tenant, 'pk') and tenant.pk != 0:
                qs = qs.filter(tenant=tenant)
        return qs

    def for_tenant(self, tenant):
        return TenantQuerySet(self.model, using=self._db).for_tenant(tenant)

    def all_tenants(self):
        """Bypass tenant filter — for Super Admin views only."""
        return TenantQuerySet(self.model, using=self._db)
