from rest_framework.generics import ListAPIView
from rest_framework.permissions import IsAuthenticated

from .models import AuthEventLog, AuditLog
from .serializers import AuthEventLogSerializer, AuditLogSerializer

ERROR_EVENTS = [
    AuthEventLog.EventType.LOGIN_FAIL,
    AuthEventLog.EventType.LOCKOUT,
    AuthEventLog.EventType.MFA_FAIL,
]


class ErrorLogListView(ListAPIView):
    """Error events only (failed logins, lockouts, MFA failures), newest first."""

    serializer_class = AuthEventLogSerializer

    def get_queryset(self):
        return AuthEventLog.objects.filter(event_type__in=ERROR_EVENTS).select_related("user")


class AllLogListView(ListAPIView):
    """Every auth event, newest first — with filters:
    ?event_type=LOGIN_SUCCESS  ?user=<id>  ?q=<search email/ip/ua/fp>
    ?date_from=YYYY-MM-DD  ?date_to=YYYY-MM-DD
    """

    serializer_class = AuthEventLogSerializer

    def get_queryset(self):
        from django.db.models import Q
        qs = AuthEventLog.objects.select_related("user").all()
        p = self.request.query_params

        event_type = p.get("event_type")
        if event_type and event_type != "ALL":
            qs = qs.filter(event_type=event_type)

        user_id = p.get("user")
        if user_id:
            qs = qs.filter(user_id=user_id)

        q = (p.get("q") or "").strip()
        if q:
            qs = qs.filter(
                Q(user__email__icontains=q) |
                Q(user__full_name__icontains=q) |
                Q(ip_address__icontains=q) |
                Q(user_agent__icontains=q) |
                Q(device_fingerprint__icontains=q)
            )

        date_from = p.get("date_from")
        if date_from:
            qs = qs.filter(created_at__date__gte=date_from)
        date_to = p.get("date_to")
        if date_to:
            qs = qs.filter(created_at__date__lte=date_to)

        return qs


class AuditLogListView(ListAPIView):
    """Every generic system activity, newest first."""
    serializer_class = AuditLogSerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        return AuditLog.objects.select_related("user").all()[:100]
