# -*- coding: utf-8 -*-
"""
Authentication backend для PlatformAdmin.

Этот backend используется для аутентификации администраторов платформы.
Работает на public домене, а также на tenant доменах для суперадминов.

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


class PlatformAdminBackend:
    """
    Backend аутентификации для PlatformAdmin.

    НЕ наследуется от ModelBackend! Полностью независимая реализация.
    
    Особенности:
    - На public домене: аутентифицирует любого PlatformAdmin
    - На tenant домене: аутентифицирует только PlatformAdmin с is_superuser=True
      (для поддержки и отладки клиентов)

    Обычные PlatformAdmin (без is_superuser) не могут логиниться на tenant доменах.
    """

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

        Args:
            request: HTTP запрос
            username: Email администратора
            password: Пароль

        Returns:
            PlatformAdmin если аутентификация успешна, иначе None
        """
        from platform_admin.models import PlatformAdmin

        if username is None or password is None:
            return None

        try:
            # Всегда читаем из default (public schema)
            user = PlatformAdmin.objects.using('default').get(email=username)
        except PlatformAdmin.DoesNotExist:
            # Run the default password hasher once to reduce the timing
            # difference between an existing and a non-existing user
            PlatformAdmin().set_password(password)
            return None

        if not user.check_password(password):
            return None

        if not self.user_can_authenticate(user):
            return None

        # На tenant домене — только суперадмин может логиниться
        schema_name = getattr(connection, 'schema_name', 'public')
        if schema_name != 'public' and not user.is_superuser:
            return None

        return user

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

        Всегда читает из public schema.
        """
        from platform_admin.models import PlatformAdmin

        try:
            return PlatformAdmin.objects.using('default').get(pk=user_id)
        except PlatformAdmin.DoesNotExist:
            return None

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

    def has_perm(self, user_obj, perm, obj=None):
        """
        Проверка permissions для PlatformAdmin.

        ВАЖНО: Этот backend работает ТОЛЬКО с PlatformAdmin!
        Для CustomUser возвращает None (пропускает проверку).
        
        Для PlatformAdmin проверяем только is_superuser (без groups/permissions).
        """
        from platform_admin.models import PlatformAdmin

        # Проверяем только PlatformAdmin, CustomUser пропускаем
        if not isinstance(user_obj, PlatformAdmin):
            return None

        # Только суперпользователь имеет права
        # (не используем groups/permissions из Django, т.к. AUTH_USER_MODEL != реальная модель)
        return user_obj.is_active and user_obj.is_superuser

    def has_module_perms(self, user_obj, app_label):
        """
        Проверка module permissions для PlatformAdmin.

        ВАЖНО: Этот backend работает ТОЛЬКО с PlatformAdmin!
        Для CustomUser возвращает None (пропускает проверку).
        
        Для PlatformAdmin проверяем только is_superuser (без groups/permissions).
        """
        from platform_admin.models import PlatformAdmin

        # Проверяем только PlatformAdmin, CustomUser пропускаем
        if not isinstance(user_obj, PlatformAdmin):
            return None

        # Только суперпользователь имеет права
        return user_obj.is_active and user_obj.is_superuser
