"""
security/views.py
==================
Vistas del módulo de auditoría. Solo accesibles por el admin.
"""

import logging
from rest_framework import viewsets
from rest_framework import serializers as drf_serializers

from security.models import AuditLog, IPBlocklist
from shared.permissions import IsAdmin
from shared.utils.responses import success_response, error_response
from shared.pagination import LargePagination

logger = logging.getLogger('security')


class AuditLogSerializer(drf_serializers.ModelSerializer):
    usuario_id = drf_serializers.IntegerField(source='usuario.id', read_only=True, allow_null=True)
    rol        = drf_serializers.CharField(source='usuario.role', read_only=True, allow_null=True)

    class Meta:
        model  = AuditLog
        fields = [
            'id', 'usuario_id', 'rol', 'accion', 'ip',
            'detalle', 'endpoint', 'user_agent', 'created_at',
        ]


class AuditLogViewSet(viewsets.ReadOnlyModelViewSet):
    """
    GET /security/audit-logs/
    Historial completo de auditoría. Solo admin.
    Filtros: ?accion=LOGIN_OK, ?ip=45.33.21.100
    """
    serializer_class   = AuditLogSerializer
    permission_classes = [IsAdmin]
    pagination_class   = LargePagination

    def get_queryset(self):
        qs = AuditLog.objects.select_related('usuario').order_by('-created_at')
        accion = self.request.query_params.get('accion')
        if accion:
            qs = qs.filter(accion=accion)
        ip = self.request.query_params.get('ip')
        if ip:
            qs = qs.filter(ip=ip)
        return qs


class IPBlocklistViewSet(viewsets.ModelViewSet):
    """
    GET  /security/ip-blocklist/           → lista IPs bloqueadas
    POST /security/ip-blocklist/           → bloquear IP manualmente
    DEL  /security/ip-blocklist/{ip_id}/   → desbloquear IP
    """
    permission_classes = [IsAdmin]

    def get_queryset(self):
        return IPBlocklist.objects.order_by('-created_at')

    def get_serializer_class(self):
        class IPBlocklistSerializer(drf_serializers.ModelSerializer):
            class Meta:
                model  = IPBlocklist
                fields = ['id', 'ip', 'motivo', 'bloqueada_hasta', 'intentos', 'created_at']
        return IPBlocklistSerializer
