from django.contrib import admin
from .models import (
    Program, ProgramHighlight, Semester, Course, Specialization,
    AdmissionRequirement, ApplicationTimeline, Scholarship, FAQItem,
    ApplicationCall
)
from traduction.admin_mixins import TranslatableAdminMixin
from config.admin_mixins import OrderableAdminMixin


class ProgramHighlightInline(admin.TabularInline):
    model = ProgramHighlight
    extra = 1
    ordering = ['order']


class SemesterInline(admin.TabularInline):
    model = Semester
    extra = 0
    show_change_link = True
    ordering = ['number']


class SpecializationInline(admin.TabularInline):
    model = Specialization
    extra = 1
    ordering = ['order']


@admin.register(Program)
class ProgramAdmin(TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['name', 'duration_months', 'ects_credits', 'language']
    inlines = [ProgramHighlightInline, SemesterInline, SpecializationInline]

    fieldsets = (
        ('Informations generales', {
            'fields': ('name', 'full_name', 'tagline', 'description')
        }),
        ('Caracteristiques', {
            'fields': ('duration_months', 'ects_credits', 'language', 'degree_awarded')
        }),
        ('Details', {
            'fields': ('objectives', 'career_prospects'),
            'classes': ('collapse',)
        }),
    )


class CourseInline(admin.TabularInline):
    model = Course
    extra = 1
    ordering = ['order']


@admin.register(Semester)
class SemesterAdmin(TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['number', 'title', 'program', 'university']
    list_filter = ['program', 'university']
    inlines = [CourseInline]


@admin.register(Course)
class CourseAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['code', 'title', 'semester', 'credits', 'is_mandatory', 'order']
    list_editable = ['order']
    list_filter = ['semester', 'is_mandatory']
    search_fields = ['code', 'title']


@admin.register(Specialization)
class SpecializationAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['name', 'program', 'order']
    list_editable = ['order']
    list_filter = ['program']


@admin.register(AdmissionRequirement)
class AdmissionRequirementAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['title', 'requirement_type', 'order', 'is_active']
    list_editable = ['order', 'is_active']
    list_filter = ['requirement_type', 'is_active']


class ApplicationTimelineInline(admin.TabularInline):
    model = ApplicationTimeline
    extra = 1
    ordering = ['order', 'event_date']
    fields = ['title', 'event_date', 'event_type', 'icon', 'is_completed', 'order']


@admin.register(ApplicationCall)
class ApplicationCallAdmin(TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['title', 'academic_year', 'status', 'opening_date', 'deadline_date', 'timeline_count', 'is_active', 'is_featured']
    list_editable = ['status', 'is_active', 'is_featured']
    list_filter = ['status', 'is_active', 'is_featured']
    search_fields = ['title', 'academic_year']
    ordering = ['-academic_year']
    inlines = [ApplicationTimelineInline]
    actions = ['duplicate_application_call']

    fieldsets = (
        ('Informations generales', {
            'fields': ('title', 'academic_year', 'description', 'status')
        }),
        ('Dates cles', {
            'fields': ('opening_date', 'deadline_date', 'results_date', 'start_date')
        }),
        ('Candidature', {
            'fields': ('application_url', 'application_email', 'places_available', 'scholarships_available')
        }),
        ('Documents', {
            'fields': ('documents_required',),
            'classes': ('collapse',)
        }),
        ('Informations complementaires', {
            'fields': ('additional_info',),
            'classes': ('collapse',)
        }),
        ('Parametres', {
            'fields': ('is_active', 'is_featured')
        }),
    )

    def timeline_count(self, obj):
        """Affiche le nombre d'evenements du chronogramme."""
        count = obj.timeline_events.count()
        return f"{count} evenement(s)"
    timeline_count.short_description = "Chronogramme"

    @admin.action(description="Dupliquer l'appel a candidature (avec chronogramme)")
    def duplicate_application_call(self, request, queryset):
        """Action admin pour dupliquer un ou plusieurs appels a candidature."""
        duplicated = 0
        errors = []

        for call in queryset:
            try:
                new_call = call.duplicate()
                duplicated += 1
                self.message_user(
                    request,
                    f"Appel '{call.academic_year}' duplique vers '{new_call.academic_year}' "
                    f"avec {new_call.timeline_events.count()} evenement(s).",
                    level='SUCCESS'
                )
            except ValueError as e:
                errors.append(str(e))
            except Exception as e:
                errors.append(f"Erreur lors de la duplication de '{call.academic_year}': {str(e)}")

        if errors:
            for error in errors:
                self.message_user(request, error, level='ERROR')

        if duplicated > 0:
            self.message_user(
                request,
                f"{duplicated} appel(s) duplique(s) avec succes. "
                f"Les nouveaux appels sont desactives par defaut.",
                level='INFO'
            )


@admin.register(ApplicationTimeline)
class ApplicationTimelineAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['title', 'application_call', 'event_date', 'event_type', 'is_completed', 'order']
    list_editable = ['is_completed', 'order']
    list_filter = ['event_type', 'application_call', 'is_completed']
    ordering = ['order', 'event_date']


@admin.register(Scholarship)
class ScholarshipAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['name', 'coverage_type', 'amount', 'total_available', 'order', 'is_active']
    list_editable = ['order', 'is_active']
    list_filter = ['coverage_type', 'is_active']


@admin.register(FAQItem)
class FAQItemAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['question', 'category', 'order', 'is_active']
    list_editable = ['order', 'is_active']
    list_filter = ['category', 'is_active']
    search_fields = ['question', 'answer']
