"""
evaluation/views.py
====================
Vistas de evaluación: asignar notas, listar, exportar actas.
"""

import io
import logging
from django.http import HttpResponse
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework import serializers as drf_serializers

from evaluation.models import NotaAsignada, Acta
from shared.permissions import IsApprovedDocente
from rest_framework.permissions import IsAuthenticated
from shared.utils.responses import success_response, error_response
from shared.pagination import StandardPagination

logger = logging.getLogger('eduplay')


class NotaAsignadaSerializer(drf_serializers.ModelSerializer):
    alumno_nickname = drf_serializers.CharField(source='alumno.nickname', read_only=True)

    class Meta:
        model  = NotaAsignada
        fields = [
            'id', 'alumno', 'alumno_nickname', 'seccion', 'temporada',
            'tipo', 'valor', 'criterio', 'created_at',
        ]
        read_only_fields = ['id', 'docente', 'created_at']


class NotaAsignadaViewSet(viewsets.ModelViewSet):
    """
    CRUD de notas asignadas por el docente.
    GET /evaluation/notas/?seccion_id=N → listado por sección
    POST /evaluation/notas/ → asignar nota
    """
    serializer_class = NotaAsignadaSerializer
    permission_classes = [IsApprovedDocente]
    pagination_class   = StandardPagination

    def get_queryset(self):
        qs = NotaAsignada.objects.filter(
            docente=self.request.user
        ).select_related('alumno', 'seccion', 'temporada')

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

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

        return qs.order_by('-created_at')

    def perform_create(self, serializer):
        serializer.save(docente=self.request.user)

    @action(detail=False, methods=['get'])
    def exportar_excel(self, request):
        """
        GET /evaluation/notas/exportar-excel/?seccion_id=N
        Genera un archivo Excel con todas las notas de la sección.
        """
        seccion_id = request.query_params.get('seccion_id')
        if not seccion_id:
            return error_response(message='seccion_id requerido.', status_code=400)

        try:
            import openpyxl
            from openpyxl.styles import Font, PatternFill, Alignment
        except ImportError:
            return error_response(message='openpyxl no instalado.', status_code=500)

        notas = NotaAsignada.objects.filter(
            docente=request.user, seccion_id=seccion_id
        ).select_related('alumno', 'temporada').order_by('alumno__id', 'created_at')

        wb = openpyxl.Workbook()
        ws = wb.active
        ws.title = 'Notas EduPlay'

        # Cabecera
        cabecera = ['Alumno', 'Temporada', 'Tipo', 'Valor', 'Criterio', 'Fecha']
        header_fill = PatternFill(start_color='1E3A5F', end_color='1E3A5F', fill_type='solid')
        for col, titulo in enumerate(cabecera, 1):
            cell = ws.cell(row=1, column=col, value=titulo)
            cell.font = Font(bold=True, color='FFFFFF')
            cell.fill = header_fill
            cell.alignment = Alignment(horizontal='center')

        # Datos
        for row, nota in enumerate(notas, 2):
            ws.cell(row=row, column=1, value=nota.alumno.nickname or f'Alumno {nota.alumno_id}')
            ws.cell(row=row, column=2, value=nota.temporada.nombre if nota.temporada else '—')
            ws.cell(row=row, column=3, value=nota.get_tipo_display())
            ws.cell(row=row, column=4, value=float(nota.valor))
            ws.cell(row=row, column=5, value=nota.criterio)
            ws.cell(row=row, column=6, value=nota.created_at.strftime('%Y-%m-%d %H:%M'))

        # Ajustar ancho de columnas
        for col in ws.columns:
            max_len = max((len(str(cell.value or '')) for cell in col), default=10)
            ws.column_dimensions[col[0].column_letter].width = min(max_len + 4, 50)

        buffer = io.BytesIO()
        wb.save(buffer)
        buffer.seek(0)

        response = HttpResponse(
            buffer.getvalue(),
            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        )
        response['Content-Disposition'] = f'attachment; filename="notas_seccion_{seccion_id}.xlsx"'
        logger.info(f'Acta Excel exportada: seccion={seccion_id} docente={request.user.id}')
        return response
