"""
Middleware: доступ ментор—студент только после подтверждения приглашения.
Блокирует взаимодействие ментора со студентом, если студент ещё не подтвердил приглашение
(и родитель при необходимости).
Проверка по client_id/student_id в query-параметрах; проверка в теле запроса — в самих view.
"""
from django.http import HttpResponseForbidden
from django.utils.deprecation import MiddlewareMixin


class MentorStudentAccessMiddleware(MiddlewareMixin):
    """
    Проверяет, что ментор обращается только к своим подтверждённым студентам.
    Если в query-параметрах передан client_id или student_id (user id студента),
    проверяется наличие связи mentor в client.mentors (приглашение подтверждено).
    """

    EXCLUDED_PATHS_PREFIXES = (
        '/api/manage/clients/add_client',
        '/api/invitation/',
        '/admin/',
        '/media/',
        '/static/',
        '/api/health/',
    )

    def process_request(self, request):
        if not request.path.startswith('/api/'):
            return None
        for prefix in self.EXCLUDED_PATHS_PREFIXES:
            if request.path.startswith(prefix):
                return None
        if not request.user.is_authenticated or getattr(request.user, 'role', None) != 'mentor':
            return None

        client_id = None
        student_id = None
        if request.GET.get('client_id'):
            try:
                client_id = int(request.GET.get('client_id'))
            except (TypeError, ValueError):
                pass
        if request.GET.get('student_id'):
            try:
                student_id = int(request.GET.get('student_id'))
            except (TypeError, ValueError):
                pass

        if client_id is None and student_id is None:
            return None

        from apps.users.models import Client

        if client_id is not None:
            if not Client.objects.filter(id=client_id, mentors=request.user).exists():
                return HttpResponseForbidden(
                    'Доступ к этому студенту запрещён до подтверждения приглашения.',
                    content_type='text/plain; charset=utf-8',
                )
        if student_id is not None:
            if not Client.objects.filter(user_id=student_id, mentors=request.user).exists():
                return HttpResponseForbidden(
                    'Доступ к этому студенту запрещён до подтверждения приглашения.',
                    content_type='text/plain; charset=utf-8',
                )
        return None
