from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, JsonResponse
from django.db.models import Count, Sum, Q, F, ExpressionWrapper, DecimalField, DateField
from django.db.models.functions import TruncDate
from django.utils import timezone
from datetime import timedelta
import csv
import json

from .models import Inscripcion, Iglesia, Grupo, Usuario, Union, LogisticaKit
from .permisos import require_role

from django.contrib.auth.models import User  # Agrega esta importación
from datetime import datetime, timedelta
from django.db.models import Count, Avg, ExpressionWrapper, DecimalField, Q
from django.shortcuts import render
from principal.models import Inscripcion, Grupo, Iglesia, LogisticaKit

from datetime import datetime, timedelta
from django.db.models import Count, Avg, ExpressionWrapper, DecimalField, Q
from django.shortcuts import render
from principal.models import Inscripcion, Grupo, Iglesia, Usuario  # Importar Usuario en lugar de User
from principal.models import Inscripcion, Grupo, Iglesia, Usuario 
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseForbidden

import csv
from datetime import datetime, timedelta
from django.db.models import Count, Avg, ExpressionWrapper, DecimalField, Q, Sum
from django.http import HttpResponse, HttpResponseForbidden
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from principal.models import Inscripcion, Grupo, Iglesia, Usuario
@login_required
def reports_dashboard(request):
    """Dashboard completo con todos los filtros y lista de campamentistas."""
    
    # Verificar permisos manualmente
    user = request.user
    allowed_roles = ['inscripcion', 'admin', 'lider']
    
    if not user.is_superuser:
        user_role = getattr(user, 'rol', None)
        if user_role not in allowed_roles:
            return HttpResponseForbidden("No tiene permiso para acceder a esta página.")
    
    # Obtener todos los inscritos base
    inscritos = Inscripcion.objects.select_related(
        'logisticakit', 'grupo', 'iglesia', 'user', 'registrado_por'
    ).order_by('-fecha_inscripcion').all()
    
    # Obtener datos para los filtros
    grupos = Grupo.objects.all().order_by('nombre')
    iglesias = Iglesia.objects.all().order_by('nombre')
    
    # CORRECCIÓN: Usar 'inscripciones_registradas' para filtrar usuarios que han inscrito a otros
    usuarios = Usuario.objects.filter(inscripciones_registradas__isnull=False).distinct().order_by('username')
    
    # Aplicar filtros dinámicos
    grupo_id = request.GET.get('grupo', '')
    sexo = request.GET.get('sexo', '')
    bautizado = request.GET.get('bautizado', '')
    edad_min = request.GET.get('edad_min', '')
    edad_max = request.GET.get('edad_max', '')
    iglesia_id = request.GET.get('iglesia', '')
    fecha_desde = request.GET.get('fecha_desde', '')
    fecha_hasta = request.GET.get('fecha_hasta', '')
    tiene_polera = request.GET.get('tiene_polera', '')
    usuario_id = request.GET.get('usuario', '')
    
    # Filtro por grupo
    if grupo_id and grupo_id != 'todos':
        inscritos = inscritos.filter(grupo_id=grupo_id)
    
    # Filtro por sexo
    if sexo and sexo != 'todos':
        inscritos = inscritos.filter(sexo=sexo)
    
    # Filtro por bautismo
    if bautizado and bautizado != 'todos':
        if bautizado == 'si':
            inscritos = inscritos.filter(bautizado=True)
        elif bautizado == 'no':
            inscritos = inscritos.filter(bautizado=False)
    
    # Filtro por edad
    if edad_min:
        try:
            inscritos = inscritos.filter(edad__gte=int(edad_min))
        except:
            pass
    if edad_max:
        try:
            inscritos = inscritos.filter(edad__lte=int(edad_max))
        except:
            pass
    
    # Filtro por iglesia
    if iglesia_id and iglesia_id != 'todos':
        inscritos = inscritos.filter(iglesia_id=iglesia_id)
    
    # Filtro por fecha de inscripción
    if fecha_desde:
        inscritos = inscritos.filter(fecha_inscripcion__gte=fecha_desde)
    if fecha_hasta:
        try:
            fecha_hasta_obj = datetime.strptime(fecha_hasta, '%Y-%m-%d') + timedelta(days=1)
            inscritos = inscritos.filter(fecha_inscripcion__lt=fecha_hasta_obj)
        except:
            pass
    
    # Filtro por polera
    if tiene_polera and tiene_polera != 'todos':
        if tiene_polera == 'si':
            inscritos = inscritos.filter(logisticakit__isnull=False)
        elif tiene_polera == 'no':
            inscritos = inscritos.filter(logisticakit__isnull=True)
    
    # Filtro por usuario que hizo la inscripción (registrado_por)
    if usuario_id and usuario_id != 'todos':
        try:
            usuario_id_int = int(usuario_id)
            inscritos = inscritos.filter(registrado_por_id=usuario_id_int)
        except:
            pass
    
    # Estadísticas básicas
    total_inscritos = Inscripcion.objects.count()
    total_filtrados = inscritos.count()
    total_con_polera = Inscripcion.objects.filter(logisticakit__isnull=False).count()
    porcentaje_con_polera = (total_con_polera / total_inscritos * 100) if total_inscritos > 0 else 0
    
    # CORRECCIÓN: Usar 'registrado_por' para contar inscripciones por usuario
    inscripciones_por_usuario = Inscripcion.objects.values(
        'registrado_por__username', 'registrado_por__email'
    ).annotate(
        total=Count('id')
    ).order_by('-total')[:5]
    
    # Estadísticas de bautismo
    bautizados_count = Inscripcion.objects.filter(bautizado=True).count()
    porcentaje_bautizados = (bautizados_count / total_inscritos * 100) if total_inscritos > 0 else 0
    
    # Calcular promedio de edad
    promedio_edad = inscritos.aggregate(avg=Avg('edad'))['avg'] or 0
    
    # Última fecha de inscripción
    ultima_inscripcion = inscritos.first()
    
    # ============ NUEVO: ESTADÍSTICAS ECONÓMICAS ============
    # Calcular estadísticas económicas de TODOS los inscritos
    estadisticas_economicas_totales = Inscripcion.objects.aggregate(
        total_costo=Sum('costo_total'),
        total_pagado=Sum('monto_pagado'),
        total_descuento=Sum('descuento'),
        total_esperado=Sum('costo_total'),
    )
    
    # Calcular estadísticas económicas de los INSCRITOS FILTRADOS
    estadisticas_filtradas = inscritos.aggregate(
        total_costo_filtrado=Sum('costo_total'),
        total_pagado_filtrado=Sum('monto_pagado'),
        total_descuento_filtrado=Sum('descuento'),
    )
    
    # Calcular comisiones (30 Bs por cada inscrito filtrado)
    total_comision_iglesia = total_filtrados * 30
    
    # Calcular monto para el comité (lo que queda después de pagar comisiones)
    monto_para_comite = (estadisticas_filtradas['total_pagado_filtrado'] or 0) - total_comision_iglesia
    if monto_para_comite < 0:
        monto_para_comite = 0
    
    # Porcentaje de recaudación
    porcentaje_recaudado = 0
    if estadisticas_filtradas['total_costo_filtrado'] and estadisticas_filtradas['total_costo_filtrado'] > 0:
        porcentaje_recaudado = (estadisticas_filtradas['total_pagado_filtrado'] or 0) / estadisticas_filtradas['total_costo_filtrado'] * 100
    
    # Inscritos con descuento
    inscritos_con_descuento = inscritos.filter(descuento__gt=0).count()
    
    # Distribución económica por iglesia (de los filtrados)
    distribucion_iglesia = inscritos.values('iglesia__nombre').annotate(
        cantidad=Count('id'),
        total_pagado=Sum('monto_pagado'),
        comision=ExpressionWrapper(
            Count('id') * 30,
            output_field=DecimalField(max_digits=10, decimal_places=2)
        )
    ).order_by('-total_pagado')[:10]
    
    # ============ FIN DE NUEVAS ESTADÍSTICAS ============
    
    contexto = {
        'total_inscritos': total_inscritos,
        'total_filtrados': total_filtrados,
        'inscritos': inscritos,
        'grupos': grupos,
        'iglesias': iglesias,
        'usuarios': usuarios,
        'total_con_polera': total_con_polera,
        'porcentaje_con_polera': round(porcentaje_con_polera, 1),
        'bautizados_count': bautizados_count,
        'porcentaje_bautizados': round(porcentaje_bautizados, 1),
        'inscripciones_por_usuario': inscripciones_por_usuario,
        'promedio_edad': round(promedio_edad, 1),
        'ultima_inscripcion': ultima_inscripcion,
        
        # Nuevas estadísticas económicas
        'estadisticas_economicas': estadisticas_economicas_totales,
        'estadisticas_filtradas': estadisticas_filtradas,
        'total_comision_iglesia': total_comision_iglesia,
        'monto_para_comite': monto_para_comite,
        'porcentaje_recaudado': round(porcentaje_recaudado, 1),
        'inscritos_con_descuento': inscritos_con_descuento,
        'distribucion_iglesia': distribucion_iglesia,
        
        # Valores actuales de filtros
        'grupo_filtro': grupo_id,
        'sexo_filtro': sexo,
        'bautizado_filtro': bautizado,
        'edad_min_filtro': edad_min,
        'edad_max_filtro': edad_max,
        'iglesia_filtro': iglesia_id,
        'fecha_desde_filtro': fecha_desde,
        'fecha_hasta_filtro': fecha_hasta,
        'tiene_polera_filtro': tiene_polera,
        'usuario_filtro': usuario_id,
    }
    return render(request, 'principal/reports_dashboard.html', contexto)

@require_role('inscripcion', 'admin', 'lider', 'director')
def report_inscritos(request):
    """Lista completa de inscritos; soporta export CSV mediante ?export=csv"""
    inscritos = Inscripcion.objects.select_related(
        'iglesia', 'union', 'grupo', 'user', 'logisticakit'
    ).all().order_by('-id')
    
    # Obtener lista de grupos para el filtro
    grupos = Grupo.objects.all().order_by('nombre')
    
    # Aplicar filtros si existen
    grupo_id = request.GET.get('grupo', '')
    sexo = request.GET.get('sexo', '')
    
    # Filtro por grupo
    if grupo_id and grupo_id != 'todos':
        inscritos = inscritos.filter(grupo_id=grupo_id)
    
    # Filtro por sexo
    if sexo and sexo != 'todos':
        inscritos = inscritos.filter(sexo=sexo)
    
    # Exportar CSV (versión simplificada)
    if request.GET.get('export') == 'csv':
        response = HttpResponse(content_type='text/csv; charset=utf-8')
        response['Content-Disposition'] = 'attachment; filename="inscritos.csv"'
        
        writer = csv.writer(response)
        
        # Encabezados simplificados
        header = [
            'N° Polera', 'Nombre', 'Email', 'Teléfono', 'Iglesia', 'Unión', 
            'Grupo', 'Color Grupo', 'Sexo', 'Edad', 
            'Fecha Inscripción'
        ]
        writer.writerow(header)
        
        for i in inscritos:
            # Obtener número de polera desde LogisticaKit relacionado
            numero_polera = ''
            if hasattr(i, 'logisticakit') and i.logisticakit:
                numero_polera = i.logisticakit.polera_numero_id or ''
            
            writer.writerow([
                numero_polera,
                i.nombre_persona,
                i.user.email if i.user else '',
                i.user.telefono if i.user and hasattr(i.user, 'telefono') else '',
                i.iglesia.nombre if i.iglesia else '',
                i.union.nombre if i.union else '',
                i.grupo.nombre if i.grupo else '',
                i.grupo.color_hex if i.grupo else '',
                i.sexo,
                i.edad,
                i.fecha_inscripcion.strftime('%Y-%m-%d %H:%M') if i.fecha_inscripcion else '',
            ])
        return response

    contexto = {
        'inscritos': inscritos,
        'total_inscritos': inscritos.count(),
        'grupos': grupos,
        'grupo_filtro': grupo_id,
        'sexo_filtro': sexo,
    }
    return render(request, 'principal/report_inscritos.html', contexto)

@require_role('inscripcion', 'admin', 'lider')
def report_economico(request):
    """Reporte económico detallado y exportable."""
    # Resumen general
    resumen = Inscripcion.objects.aggregate(
        total_inscritos=Count('id'),
        total_costo=Sum('costo_total'),
        total_paga=Sum('paga'),
        total_descuento=Sum('descuento'),
        total_pagado=Sum('monto_pagado'),
    )
    
    # Calcular saldo pendiente
    saldo_pendiente = (resumen['total_costo'] or 0) - (resumen['total_pagado'] or 0) - (resumen['total_descuento'] or 0)
    if saldo_pendiente < 0:
        saldo_pendiente = 0
    
    # Estadísticas por iglesia
    economia_iglesia = Inscripcion.objects.values('iglesia__nombre').annotate(
        total_inscritos=Count('id'),
        total_costo=Sum('costo_total'),
        total_pagado=Sum('monto_pagado'),
        total_descuento=Sum('descuento'),
        pagados=Count('id', filter=Q(paga=True)),
        pendientes=Count('id', filter=Q(paga=False)),
    ).order_by('-total_costo')
    
    # Top 10 deudores
    deudores = Inscripcion.objects.annotate(
        saldo_pendiente=ExpressionWrapper(
            F('costo_total') - F('monto_pagado') - F('descuento'),
            output_field=DecimalField(max_digits=10, decimal_places=2)
        )
    ).filter(
        saldo_pendiente__gt=0
    ).select_related('iglesia', 'user').order_by('-saldo_pendiente')[:10]
    
    # Histórico de pagos por fecha
    historico_pagos = Inscripcion.objects.exclude(
        monto_pagado=0
    ).values(
        fecha_pago=TruncDate('fecha_inscripcion')
    ).annotate(
        total_dia=Sum('monto_pagado'),
        cantidad_pagos=Count('id')
    ).order_by('-fecha_pago')[:30]  # Últimos 30 días
    
    # Entrega por iglesia (comisión de 30 Bs por campamentista)
    entrega_por_iglesia = Inscripcion.objects.values('iglesia__nombre').annotate(
        inscritos=Count('id'),
        total_pagado=Sum('monto_pagado'),
        total_comision=ExpressionWrapper(
            Count('id') * 30,
            output_field=DecimalField(max_digits=10, decimal_places=2)
        )
    ).order_by('-total_comision')
    
    contexto = {
        'resumen': resumen,
        'saldo_pendiente': saldo_pendiente,
        'economia_iglesia': economia_iglesia,
        'deudores': deudores,
        'historico_pagos': historico_pagos,
        'entrega_por_iglesia': entrega_por_iglesia,
    }
    
    # Exportar CSV
    if request.GET.get('export') == 'csv':
        response = HttpResponse(content_type='text/csv; charset=utf-8')
        response['Content-Disposition'] = 'attachment; filename="reporte_economico_general.csv"'
        
        writer = csv.writer(response)
        
        # Escribir resumen general
        writer.writerow(['INFORME ECONÓMICO GENERAL'])
        writer.writerow(['Fecha', timezone.now().strftime('%Y-%m-%d %H:%M')])
        writer.writerow([])
        writer.writerow(['RESUMEN GENERAL'])
        writer.writerow(['Total Inscritos', resumen['total_inscritos']])
        writer.writerow(['Costo Total Esperado', resumen['total_costo'] or 0])
        writer.writerow(['Total Pagado', resumen['total_pagado'] or 0])
        writer.writerow(['Total Descuentos', resumen['total_descuento'] or 0])
        writer.writerow(['Saldo Pendiente', saldo_pendiente])
        writer.writerow(['Porcentaje Recaudado', 
                        f"{((resumen['total_pagado'] or 0) / (resumen['total_costo'] or 1) * 100):.1f}%"])
        writer.writerow([])
        
        # Escribir comisiones por iglesia
        writer.writerow(['COMISIONES A ENTREGAR POR IGLESIA (Bs 30 por campamentista)'])
        writer.writerow(['Iglesia', 'Inscritos', 'Total Recaudado', 'Comisión a Entregar'])
        
        for iglesia in entrega_por_iglesia:
            writer.writerow([
                iglesia['iglesia__nombre'] or 'Sin Iglesia',
                iglesia['inscritos'],
                iglesia['total_pagado'] or 0,
                iglesia['total_comision'],
            ])
        
        writer.writerow([])
        writer.writerow(['TOTAL COMISIONES', '', '', sum([i['total_comision'] for i in entrega_por_iglesia])])
        
        return response

    return render(request, 'principal/report_economico.html', contexto)


@require_role('inscripcion', 'admin', 'lider')
def report_pendientes(request):
    """Reporte específico de inscritos con pagos pendientes."""
    pendientes = Inscripcion.objects.filter(paga=False).select_related(
        'iglesia', 'union', 'grupo', 'user'
    ).annotate(
        saldo_pendiente=ExpressionWrapper(
            F('costo_total') - F('monto_pagado') - F('descuento'),
            output_field=DecimalField(max_digits=10, decimal_places=2)
        )
    ).order_by('-saldo_pendiente')
    
    total_pendiente = pendientes.aggregate(
        total_saldo=Sum('saldo_pendiente')
    )['total_saldo'] or 0
    
    contexto = {
        'pendientes': pendientes,
        'total_pendientes': pendientes.count(),
        'total_pendiente': total_pendiente,
    }
    
    if request.GET.get('export') == 'csv':
        response = HttpResponse(content_type='text/csv; charset=utf-8')
        response['Content-Disposition'] = 'attachment; filename="pendientes_pago.csv"'
        
        writer = csv.writer(response)
        writer.writerow(['INSCRITOS CON PAGOS PENDIENTES'])
        writer.writerow(['Fecha', timezone.now().strftime('%Y-%m-%d %H:%M')])
        writer.writerow(['Total Pendientes', pendientes.count()])
        writer.writerow(['Monto Total Pendiente', total_pendiente])
        writer.writerow([])
        writer.writerow(['ID', 'Nombre', 'Iglesia', 'Unión', 'Grupo', 'Costo Total', 
                        'Pagado', 'Descuento', 'Saldo Pendiente', 'Teléfono', 'Email'])
        
        for p in pendientes:
            writer.writerow([
                p.id,
                p.nombre_persona,
                p.iglesia.nombre if p.iglesia else '',
                p.union.nombre if p.union else '',
                p.grupo.nombre if p.grupo else '',
                p.costo_total,
                p.monto_pagado,
                p.descuento,
                p.saldo_pendiente,
                p.user.telefono if p.user and hasattr(p.user, 'telefono') else '',
                p.user.email if p.user else '',
            ])
        
        return response
    
    return render(request, 'principal/report_pendientes.html', contexto)


@require_role('admin', 'lider')
def report_json(request):
    """API JSON para gráficos dinámicos."""
    report_type = request.GET.get('type', 'general')
    
    if report_type == 'general':
        data = {
            'total_inscritos': Inscripcion.objects.count(),
            'pagos_completados': Inscripcion.objects.filter(paga=True).count(),
            'pagos_pendientes': Inscripcion.objects.filter(paga=False).count(),
            'monto_total': Inscripcion.objects.aggregate(Sum('monto_pagado'))['monto_pagado__sum'] or 0,
        }
    
    elif report_type == 'por_iglesia':
        data = list(Inscripcion.objects.values('iglesia__nombre').annotate(
            total=Count('id')
        ).order_by('-total')[:10])
    
    elif report_type == 'tendencia':
        fecha_limite = timezone.now().date() - timedelta(days=30)
        data = list(Inscripcion.objects.filter(
            fecha_inscripcion__date__gte=fecha_limite
        ).annotate(
            fecha=TruncDate('fecha_inscripcion')
        ).values('fecha').annotate(
            nuevos=Count('id'),
            pagos=Count('id', filter=Q(paga=True))
        ).order_by('fecha'))
    
    return JsonResponse(data, safe=False)

@require_role('inscripcion', 'admin', 'lider')
def export_csv(request):
    """Endpoint específico para exportar CSV general"""
    from django.shortcuts import redirect
    from django.urls import reverse
    
    report_type = request.GET.get('type', 'inscritos')
    
    if report_type == 'economico':
        return redirect(f"{reverse('report_economico')}?export=csv")
    elif report_type == 'pendientes':
        return redirect(f"{reverse('report_pendientes')}?export=csv")
    else:
        return redirect(f"{reverse('report_inscritos')}?export=csv")


@require_role('inscripcion', 'admin', 'lider', 'director')
def report_generales(request):
    """Reportes generales con filtros: color, iglesia, union, sexo, bautizado, edad y fechas."""
    qs = Inscripcion.objects.select_related('iglesia', 'union', 'grupo', 'user').all()

    # Aplicar filtros GET
    color = request.GET.get('color') or request.GET.get('color_hex') or request.GET.get('color_nombre')
    iglesia_id = request.GET.get('iglesia')
    union_id = request.GET.get('union')
    sexo = request.GET.get('sexo')
    bautizado = request.GET.get('bautizado')
    edad_min = request.GET.get('edad_min')
    edad_max = request.GET.get('edad_max')
    fecha_inicio = request.GET.get('fecha_inicio')
    fecha_fin = request.GET.get('fecha_fin')

    if color:
        # intentar por hex y por nombre
        qs = qs.filter(Q(grupo__color_hex__iexact=color) | Q(grupo__color_nombre__iexact=color))
    if iglesia_id:
        qs = qs.filter(iglesia__id=iglesia_id)
    if union_id:
        qs = qs.filter(union__id=union_id)
    if sexo:
        qs = qs.filter(sexo__iexact=sexo)
    if bautizado in ['1', 'true', 'True', 'sí', 'si', 'yes']:
        qs = qs.filter(bautizado=True)
    elif bautizado in ['0', 'false', 'False', 'no']:
        qs = qs.filter(bautizado=False)
    try:
        if edad_min:
            qs = qs.filter(edad__gte=int(edad_min))
        if edad_max:
            qs = qs.filter(edad__lte=int(edad_max))
    except ValueError:
        pass

    try:
        if fecha_inicio:
            qs = qs.filter(fecha_inscripcion__date__gte=fecha_inicio)
        if fecha_fin:
            qs = qs.filter(fecha_inscripcion__date__lte=fecha_fin)
    except Exception:
        pass

    # Agregados principales
    total = qs.count()
    por_color = qs.values('grupo__color_nombre', 'grupo__color_hex').annotate(total=Count('id')).order_by('-total')
    por_iglesia = qs.values('iglesia__nombre').annotate(total=Count('id')).order_by('-total')
    por_union = qs.values('union__nombre').annotate(total=Count('id')).order_by('-total')
    por_sexo = qs.values('sexo').annotate(total=Count('id'))
    bautizados = qs.filter(bautizado=True).count()

    # Listas para filtros
    all_iglesias = Iglesia.objects.all()
    all_uniones = Union.objects.all()
    colores = Grupo.objects.values('color_nombre', 'color_hex').distinct()

    contexto = {
        'filtro_qs': qs,
        'total_filtrado': total,
        'por_color': por_color,
        'por_iglesia': por_iglesia,
        'por_union': por_union,
        'por_sexo': por_sexo,
        'bautizados': bautizados,
        'filtros': request.GET,
        'all_iglesias': all_iglesias,
        'all_uniones': all_uniones,
        'colores': colores,
    }

    # Export CSV opcional
    if request.GET.get('export') == 'csv':
        response = HttpResponse(content_type='text/csv; charset=utf-8')
        response['Content-Disposition'] = 'attachment; filename="report_generales.csv"'
        writer = csv.writer(response)
        writer.writerow(['N° Campamentista', 'N° Polera', 'ID', 'Nombre', 'Iglesia', 'Unión', 'Grupo', 'Color', 'Sexo', 'Edad', 'Bautizado', 'Fecha Inscripción', 'Costo Total', 'Descuento', 'Monto Pagado'])
        for i in qs.order_by('-id'):
            writer.writerow([
                i.numero_campamentista if hasattr(i, 'numero_campamentista') and i.numero_campamentista else '',
                i.numero_polera if hasattr(i, 'numero_polera') and i.numero_polera else '',
                i.id,
                i.nombre_persona,
                i.iglesia.nombre if i.iglesia else '',
                i.union.nombre if i.union else '',
                i.grupo.nombre if i.grupo else '',
                i.grupo.color_nombre if i.grupo else '',
                i.sexo,
                i.edad,
                'Sí' if i.bautizado else 'No',
                i.fecha_inscripcion.strftime('%Y-%m-%d %H:%M') if i.fecha_inscripcion else '',
                i.costo_total,
                i.descuento,
                i.monto_pagado,
            ])
        return response

    return render(request, 'principal/report_generales.html', contexto)


@require_role('inscripcion', 'admin', 'lider')
def report_pago_detallado(request):
    """Informe detallado por persona: cuánto pagó, descuento, quién lo inscribió y resumen económico incluyendo comisión a la iglesia."""
    qs = Inscripcion.objects.select_related('iglesia', 'user').all()

    # Filtrar por iglesia opcional
    iglesia_id = request.GET.get('iglesia')
    if iglesia_id:
        qs = qs.filter(iglesia__id=iglesia_id)

    # Detalle por persona (calcular comisión como 30 Bs por persona)
    detalle = qs.annotate(
        comision_iglesia=ExpressionWrapper(
            30,  # Comisión fija de 30 Bs por campamentista
            output_field=DecimalField(max_digits=10, decimal_places=2)
        )
    ).values(
        'id', 'numero_campamentista', 'numero_polera', 'nombre_persona', 'iglesia__nombre', 
        'user__username', 'costo_total', 'descuento', 'monto_pagado', 'comision_iglesia', 
        'fecha_inscripcion'
    ).order_by('-fecha_inscripcion')

    # Resumen
    resumen_totales = qs.aggregate(
        total_inscritos=Count('id'),
        total_pagado=Sum('monto_pagado'),
        total_descuento=Sum('descuento'),
        total_costo=Sum('costo_total'),
    )
    
    # Calcular comisión total (30 Bs * número de inscritos)
    resumen_totales['total_comision_iglesia'] = resumen_totales['total_inscritos'] * 30

    # Calcular monto a entregar por iglesia
    entrega_por_iglesia = qs.values('iglesia__nombre').annotate(
        inscritos=Count('id'),
        total_pagado=Sum('monto_pagado'),
        total_comision=ExpressionWrapper(
            Count('id') * 30,
            output_field=DecimalField(max_digits=10, decimal_places=2)
        )
    ).order_by('-total_comision')

    # Listas para filtros
    all_iglesias = Iglesia.objects.all()

    contexto = {
        'detalle': detalle,
        'resumen': resumen_totales,
        'entrega_por_iglesia': entrega_por_iglesia,
        'filtros': request.GET,
        'all_iglesias': all_iglesias,
    }

    if request.GET.get('export') == 'csv':
        response = HttpResponse(content_type='text/csv; charset=utf-8')
        response['Content-Disposition'] = 'attachment; filename="reporte_pago_detallado.csv"'
        writer = csv.writer(response)
        writer.writerow(['N° Campamentista', 'N° Polera', 'ID', 'Nombre', 'Iglesia', 'Inscrito por', 'Costo Total', 'Descuento', 'Monto Pagado', 'Comisión Iglesia', 'Fecha Inscripción'])
        for r in detalle:
            writer.writerow([
                r.get('numero_campamentista', ''),
                r.get('numero_polera', ''),
                r['id'], 
                r['nombre_persona'], 
                r['iglesia__nombre'], 
                r['user__username'], 
                r['costo_total'], 
                r['descuento'], 
                r['monto_pagado'], 
                r['comision_iglesia'], 
                r['fecha_inscripcion'].strftime('%Y-%m-%d %H:%M') if r['fecha_inscripcion'] else ''
            ])
        # Agregar resumen al final
        writer.writerow([])
        writer.writerow(['RESUMEN'])
        writer.writerow(['Total Inscritos', resumen_totales.get('total_inscritos')])
        writer.writerow(['Total Pagado', resumen_totales.get('total_pagado') or 0])
        writer.writerow(['Total Descuento', resumen_totales.get('total_descuento') or 0])
        writer.writerow(['Total Comisión Iglesia (a entregar)', resumen_totales.get('total_comision_iglesia') or 0])
        return response

    return render(request, 'principal/report_pago_detallado.html', contexto)