import logging
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.pagination import PageNumberPagination
from people.models import Teacher, Student
from .models import TeacherActivity, StudentActivity
from .serializers import TeacherActivitySerializer, StudentActivitySerializer

logger = logging.getLogger(__name__)


class StandardResultsSetPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100


class TeacherMyActivityListView(APIView):
    """
    GET /teacher/activities/
    Returns the authenticated teacher's own activity log.
    Optional filters: ?action=CREATE_CLASS_GROUP&page=1&page_size=20
    """

    permission_classes = [IsAuthenticated]

    def get(self, request):
        try:
            teacher = Teacher.objects.get(external_user_id=request.user.id)

            qs = TeacherActivity.objects.filter(teacher=teacher)

            action = request.query_params.get('action')
            if action:
                qs = qs.filter(action=action)

            paginator = StandardResultsSetPagination()
            page = paginator.paginate_queryset(qs, request)
            serializer = TeacherActivitySerializer(page, many=True)

            return Response({
                'success': True,
                'data': {
                    'activities': serializer.data,
                    'pagination': {
                        'page': paginator.page.number,
                        'page_size': paginator.get_page_size(request),
                        'total': paginator.page.paginator.count,
                        'has_next': paginator.page.has_next(),
                        'has_previous': paginator.page.has_previous(),
                    },
                },
            })

        except Teacher.DoesNotExist:
            return Response(
                {'success': False, 'message': 'Teacher not found'},
                status=status.HTTP_404_NOT_FOUND,
            )
        except Exception as e:
            logger.error(f'Error in TeacherMyActivityListView: {e}', exc_info=True)
            return Response(
                {'success': False, 'message': str(e)},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR,
            )


class AllTeacherActivitiesView(APIView):
    """
    GET /school-admin/teacher-activities/
    Admin view: all teachers' activity logs.
    Optional filters: ?teacher_id=5&action=CREATE_TASK&page=1
    """

    permission_classes = [IsAuthenticated]

    def get(self, request):
        try:
            if not request.user.is_staff:
                return Response(
                    {'success': False, 'message': 'Permission denied.'},
                    status=status.HTTP_403_FORBIDDEN,
                )

            qs = TeacherActivity.objects.select_related('teacher').all()

            teacher_id = request.query_params.get('teacher_id')
            action = request.query_params.get('action')
            if teacher_id:
                qs = qs.filter(teacher_id=teacher_id)
            if action:
                qs = qs.filter(action=action)

            paginator = StandardResultsSetPagination()
            page = paginator.paginate_queryset(qs, request)
            serializer = TeacherActivitySerializer(page, many=True)

            return Response({
                'success': True,
                'data': {
                    'activities': serializer.data,
                    'pagination': {
                        'page': paginator.page.number,
                        'page_size': paginator.get_page_size(request),
                        'total': paginator.page.paginator.count,
                        'has_next': paginator.page.has_next(),
                        'has_previous': paginator.page.has_previous(),
                    },
                },
            })

        except Exception as e:
            logger.error(f'Error in AllTeacherActivitiesView: {e}', exc_info=True)
            return Response(
                {'success': False, 'message': str(e)},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR,
            )


class AllStudentActivitiesView(APIView):
    """
    GET /school-admin/student-activities/
    Admin view: student activity logs.
    Optional filters: ?student_id=5&action=SUBMIT_TASK&page=1
    """

    permission_classes = [IsAuthenticated]

    def get(self, request):
        try:
            if not request.user.is_staff:
                return Response(
                    {'success': False, 'message': 'Permission denied.'},
                    status=status.HTTP_403_FORBIDDEN,
                )

            qs = StudentActivity.objects.select_related('student').all()

            student_id = request.query_params.get('student_id')
            action = request.query_params.get('action')
            if student_id:
                qs = qs.filter(student_id=student_id)
            if action:
                qs = qs.filter(action=action)

            paginator = StandardResultsSetPagination()
            page = paginator.paginate_queryset(qs, request)
            serializer = StudentActivitySerializer(page, many=True)

            return Response({
                'success': True,
                'data': {
                    'activities': serializer.data,
                    'pagination': {
                        'page': paginator.page.number,
                        'page_size': paginator.get_page_size(request),
                        'total': paginator.page.paginator.count,
                        'has_next': paginator.page.has_next(),
                        'has_previous': paginator.page.has_previous(),
                    },
                },
            })

        except Exception as e:
            logger.error(f'Error in AllStudentActivitiesView: {e}', exc_info=True)
            return Response(
                {'success': False, 'message': str(e)},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR,
            )
