from django.contrib import admin
from import_export import resources
from import_export.admin import ImportExportModelAdmin
from django.contrib.auth.models import User, Group
from .models import Secretaria, Estudiante,Calificacion, Docente,  ProgramaEducativo, PeriodoAcademico, Nivel, Materia, Matricula

# Definición del recurso de importación y exportación para Secretaria
class SecretariaResource(resources.ModelResource):
    class Meta:
        model = Secretaria

# Configuración del panel de administración para Secretaria
class SecretariaAdmin(ImportExportModelAdmin, admin.ModelAdmin):
    list_display = ['nui', 'nombre', 'apellido', 'correo_institucional', 'telefono', 'celular']
    search_fields = ['nui', 'nombre', 'apellido', 'correo_institucional']
    list_filter = ['sexo', 'estado_civil', 'nacionalidad']
    ordering = ['apellido']
    resource_class = SecretariaResource

    fieldsets = (
        (None, {'fields': ('usuario', 'nui', 'nombre', 'apellido', 'fecha_nacimiento', 'nacionalidad')}), 
        ('Ubicación', {'fields': ('provincia_nacimiento', 'canto_nacimiento', 'ciudad_nacimiento', 
                                  'provincia_residencia', 'canto_residencia', 'ciudad_residencia', 
                                  'direccion_residencia')}), 
        ('Contacto', {'fields': ('correo_personal', 'correo_institucional', 'telefono', 'celular', 
                                 'celular_emergencia', 'nombre_emergencia')}), 
        ('Otros Datos', {'fields': ('sexo', 'genero', 'tipo_sangre', 'estado_civil', 'etnia', 'discapacidad')}), 
    )

    def save_model(self, request, obj, form, change):
        if not obj.usuario:
            user = User.objects.create_user(
                username=str(obj.nui),
                email=obj.correo_institucional,
                password='Alu_user8*',
                first_name=obj.nombre,
                last_name=obj.apellido,
            )
            group, _ = Group.objects.get_or_create(name='Secretaria')
            user.groups.add(group)
            obj.usuario = user
        obj.save()

admin.site.register(Secretaria, SecretariaAdmin)

# Configuración del panel de administración para Estudiante
class EstudianteAdmin(admin.ModelAdmin):
    list_display = ('usuario', 'nui', 'apellido', 'nombre', 'correo_institucional', 'celular')
    search_fields = ('nui', 'apellido', 'nombre', 'correo_institucional')
    list_filter = ('genero', 'estado_civil', 'nacionalidad', 'provincia_residencia')
    ordering = ('apellido', 'nombre')
    readonly_fields = ('usuario',)

    fieldsets = (
        ('Información Personal', {
            'fields': ('usuario', 'nui', 'apellido', 'nombre', 'fecha_nacimiento', 'genero', 'sexo', 'tipo_sangre', 'estado_civil', 'etnia')
        }),
        ('Contacto', {
            'fields': ('correo_personal', 'correo_institucional', 'telefono', 'celular', 'celular_emergencia', 'nombre_emergencia')
        }),
        ('Lugar de Nacimiento', {
            'fields': ('nacionalidad', 'provincia_nacimiento', 'canto_nacimiento', 'ciudad_nacimiento')
        }),
        ('Residencia', {
            'fields': ('provincia_residencia', 'canto_residencia', 'ciudad_residencia', 'direccion_residencia')
        }),
        ('Información Adicional', {
            'fields': ('discapacidad',)
        }),
    )

    def save_model(self, request, obj, form, change):
        if not obj.usuario:
            user = User.objects.create_user(
                username=str(obj.nui),
                email=obj.correo_institucional,
                password='Alu_user8*',
                first_name=obj.nombre,
                last_name=obj.apellido,
            )
            group, _ = Group.objects.get_or_create(name='Estudiante')
            user.groups.add(group)
            obj.usuario = user
        obj.save()

admin.site.register(Estudiante, EstudianteAdmin)


# Definición del recurso de importación y exportación para Docente
class DocenteResource(resources.ModelResource):
    class Meta:
        model = Docente

# Configuración del panel de administración para Docente
class DocenteAdmin(ImportExportModelAdmin, admin.ModelAdmin):
    list_display = ['nui', 'nombre', 'apellido', 'correo_institucional', 'telefono', 'celular']
    search_fields = ['nui', 'nombre', 'apellido', 'correo_institucional']
    list_filter = ['sexo', 'estado_civil', 'nacionalidad']
    ordering = ['apellido']
    resource_class = DocenteResource

    fieldsets = (
        (None, {'fields': ('usuario', 'nui', 'nombre', 'apellido', 'fecha_nacimiento', 'nacionalidad')}), 
        ('Ubicación', {'fields': ('provincia_nacimiento', 'canto_nacimiento', 'ciudad_nacimiento', 
                                  'provincia_residencia', 'canto_residencia', 'ciudad_residencia', 
                                  'direccion_residencia')}), 
        ('Contacto', {'fields': ('correo_personal', 'correo_institucional', 'telefono', 'celular', 
                                 'celular_emergencia', 'nombre_emergencia')}), 
        ('Otros Datos', {'fields': ('sexo', 'genero', 'tipo_sangre', 'estado_civil', 'etnia', 'discapacidad')}), 
    )

    def save_model(self, request, obj, form, change):
        if not obj.usuario:
            user = User.objects.create_user(
                username=str(obj.nui),
                email=obj.correo_institucional,
                password=str(obj.nui),
                first_name=obj.nombre,
                last_name=obj.apellido,
            )
            group, _ = Group.objects.get_or_create(name='Docente')
            user.groups.add(group)
            obj.usuario = user
        obj.save()

admin.site.register(Docente, DocenteAdmin)



@admin.register(ProgramaEducativo)
class ProgramaEducativoAdmin(admin.ModelAdmin):
    list_display = ('nombre', 'modalidad')
    search_fields = ('nombre', 'modalidad')

@admin.register(PeriodoAcademico)
class PeriodoAcademicoAdmin(admin.ModelAdmin):
    list_display = ('nombre', 'fecha_inicio', 'fecha_fin', 'activo')
    list_filter = ('activo',)
    actions = ['activar_periodo', 'cerrar_periodo']

    def activar_periodo(self, request, queryset):
        """ Activa solo un período y desactiva los demás """
        PeriodoAcademico.objects.all().update(activo=False)
        queryset.update(activo=True)
        self.message_user(request, "El período seleccionado ahora está activo.")

    def cerrar_periodo(self, request, queryset):
        """ Cierra los períodos seleccionados """
        queryset.update(activo=False)
        self.message_user(request, "Los períodos seleccionados han sido cerrados.")

    activar_periodo.short_description = "Activar el período académico seleccionado"
    cerrar_periodo.short_description = "Cerrar los períodos académicos seleccionados"

@admin.register(Nivel)
class NivelAdmin(admin.ModelAdmin):
    list_display = ('nombre', 'programa', 'nivel', 'periodo', 'activo')
    list_filter = ('programa', 'periodo', 'activo')
    search_fields = ('nombre', 'programa__nombre')

class MatriculaInline(admin.TabularInline):  # Permite agregar estudiantes a la materia
    model = Matricula
    extra = 1  # Número de campos adicionales para agregar más estudiantes rápidamente
    autocomplete_fields = ['estudiante']
    fields = ['estudiante', 'periodo', 'activo']
    show_change_link = True

@admin.register(Materia)
class MateriaAdmin(admin.ModelAdmin):
    list_display = ('nombre', 'nivel', 'activo')
    list_filter = ('nivel__programa', 'nivel__periodo', 'activo')
    search_fields = ('nombre',)
    inlines = [MatriculaInline]  # Permite matricular estudiantes desde la vista de Materia

@admin.register(Matricula)
class MatriculaAdmin(admin.ModelAdmin):
    list_display = ('estudiante', 'materia', 'periodo', 'activo')
    list_filter = ('periodo', 'materia__nivel', 'activo')
    search_fields = ('estudiante__nombre', 'materia__nombre')

# ======= CALIFICACIÓN =======
@admin.register(Calificacion)
class CalificacionAdmin(admin.ModelAdmin):
    list_display = ('matricula', 'nota1_sem1', 'nota2_sem1', 'prueba_sem1', 'examen_sem1', 
                    'nota1_sem2', 'nota2_sem2', 'prueba_sem2', 'examen_sem2', 
                    'recuperacion', 'nota_final', 'aprobado')
    
    list_filter = ('matricula__materia', 'matricula__periodo', 'aprobado')  # 🔍 ¿Estás filtrando datos?
    search_fields = ('matricula__estudiante__nombre', 'matricula__materia__nombre')

    def get_queryset(self, request):
        """ Verifica que no estés limitando los registros aquí """
        qs = super().get_queryset(request)
        return qs  # ✅ Asegúrate de no hacer filtros innecesarios aquí
