# -*- coding: utf-8 -*-
"""
Authentication backend для CustomUser (пользователей тенантов).

Этот backend используется для аутентификации пользователей магазинов.
Работает ТОЛЬКО на tenant доменах, НЕ на public домене.

ВАЖНО: CustomUser теперь в TENANT_APPS - каждый тенант имеет свою таблицу!
Backend работает с таблицей accounts_customuser в текущей tenant schema.

ВАЖНО: НЕ наследуется от ModelBackend! Полностью независимая реализация.
"""
from django.db import connection


class TenantUserBackend:
    """
    Backend аутентификации для CustomUser (tenant-only).

    НЕ наследуется от ModelBackend! Полностью независимая реализация.
    
    Особенности:
    - Работает ТОЛЬКО на tenant доменах (не на public)
    - Ищет пользователя в таблице accounts_customuser текущей tenant schema
    - Один email в разных тенантах = разные записи в разных таблицах БД

    Пользователь из tenant A физически не существует в tenant B.
    """

    def authenticate(self, request, username=None, password=None, **kwargs):
        """
        Аутентификация CustomUser по email и паролю.

        Args:
            request: HTTP запрос
            username: Email пользователя
            password: Пароль

        Returns:
            CustomUser если аутентификация успешна, иначе None
        """
        # Не работает на public домене
        schema_name = getattr(connection, 'schema_name', 'public')
        if schema_name == 'public':
            return None

        if username is None or password is None:
            return None

        # Импортируем напрямую, не через get_user_model()
        # т.к. AUTH_USER_MODEL теперь PlatformAdmin
        from accounts.models import CustomUser

        try:
            # django-tenants автоматически направляет запрос в текущую schema
            user = CustomUser.objects.get(email=username)
        except CustomUser.DoesNotExist:
            # Run the default password hasher once to reduce the timing
            # difference between an existing and a non-existing user
            CustomUser().set_password(password)
            return None

        if not user.check_password(password):
            return None

        if not self.user_can_authenticate(user):
            return None

        return user

    def get_user(self, user_id):
        """
        Получение CustomUser по ID.

        На public домене возвращает None.
        """
        schema_name = getattr(connection, 'schema_name', 'public')
        if schema_name == 'public':
            return None

        from accounts.models import CustomUser

        try:
            return CustomUser.objects.get(pk=user_id)
        except CustomUser.DoesNotExist:
            return None

    def user_can_authenticate(self, user):
        """
        Проверка что пользователь активен.
        """
        is_active = getattr(user, 'is_active', None)
        return is_active or is_active is None
