from django.contrib import admin

from secondary.models import (
    ALevelCompetencyScale,
    ALevelComponentWeight,
    ALevelModuleAssessment,
    ALevelSubjectModule,
    CAModeration,
    ContinuousAssessmentRecord,
    ContinuousAssessmentTask,
    SecondaryCompetency,
    SecondaryComputationPolicy,
    SecondaryGradeBand,
    SubjectCompetency,
    UNEBSubmissionBatch,
    UNEBSubmissionItem,
)


@admin.register(SecondaryComputationPolicy)
class SecondaryComputationPolicyAdmin(admin.ModelAdmin):
    list_display = (
        "name",
        "section",
        "level",
        "ca_weight",
        "exam_weight",
        "rounding_mode",
        "effective_from",
        "effective_to",
        "is_active",
    )
    list_filter = ("section", "level", "rounding_mode", "is_active")
    search_fields = ("name",)


@admin.register(SecondaryGradeBand)
class SecondaryGradeBandAdmin(admin.ModelAdmin):
    list_display = ("policy", "grade", "descriptor", "min_score", "max_score", "display_order")
    list_filter = ("policy", "grade")
    search_fields = ("grade", "descriptor")


@admin.register(SecondaryCompetency)
class SecondaryCompetencyAdmin(admin.ModelAdmin):
    list_display = ("code", "name", "is_active")
    list_filter = ("is_active",)
    search_fields = ("code", "name")


@admin.register(SubjectCompetency)
class SubjectCompetencyAdmin(admin.ModelAdmin):
    list_display = ("subject", "competency", "section", "is_core")
    list_filter = ("section", "is_core")
    search_fields = ("subject__name", "competency__name", "competency__code")


@admin.register(ContinuousAssessmentTask)
class ContinuousAssessmentTaskAdmin(admin.ModelAdmin):
    list_display = (
        "title",
        "academic_class",
        "subject",
        "task_type",
        "weight",
        "max_score",
        "uneb_eligible",
        "status",
        "assigned_date",
    )
    list_filter = ("status", "task_type", "uneb_eligible", "academic_class", "subject")
    search_fields = ("title", "subject__name", "academic_class__Class__name")


@admin.register(ContinuousAssessmentRecord)
class ContinuousAssessmentRecordAdmin(admin.ModelAdmin):
    list_display = (
        "student",
        "task",
        "raw_score",
        "moderated_score",
        "moderation_status",
        "is_locked",
        "updated_at",
    )
    list_filter = ("moderation_status", "is_locked", "task__subject")
    search_fields = ("student__student_name", "student__reg_no", "task__title", "task__subject__name")


@admin.register(CAModeration)
class CAModerationAdmin(admin.ModelAdmin):
    list_display = ("record", "status", "moderated_score", "moderated_by", "moderated_at")
    list_filter = ("status", "moderated_by")
    search_fields = ("record__student__student_name", "record__task__title")


@admin.register(UNEBSubmissionBatch)
class UNEBSubmissionBatchAdmin(admin.ModelAdmin):
    list_display = (
        "title",
        "academic_year",
        "section",
        "level",
        "candidate_class",
        "status",
        "submission_reference",
        "created_at",
    )
    list_filter = ("status", "section", "level", "academic_year")
    search_fields = ("title", "submission_reference")


@admin.register(UNEBSubmissionItem)
class UNEBSubmissionItemAdmin(admin.ModelAdmin):
    list_display = (
        "batch",
        "student",
        "subject",
        "ca_mark",
        "final_ca_mark",
        "moderation_status",
        "is_locked",
    )
    list_filter = ("moderation_status", "is_locked", "subject")
    search_fields = ("student__student_name", "student__reg_no", "subject__name")


@admin.register(ALevelCompetencyScale)
class ALevelCompetencyScaleAdmin(admin.ModelAdmin):
    list_display = (
        "policy",
        "code",
        "descriptor",
        "point_value",
        "min_weighted_point",
        "max_weighted_point",
        "display_order",
    )
    list_filter = ("policy", "code")
    search_fields = ("policy__name", "descriptor")


@admin.register(ALevelComponentWeight)
class ALevelComponentWeightAdmin(admin.ModelAdmin):
    list_display = ("policy", "subject", "component_type", "weight", "is_required")
    list_filter = ("policy", "component_type", "is_required", "subject")
    search_fields = ("policy__name", "subject__name")


@admin.register(ALevelSubjectModule)
class ALevelSubjectModuleAdmin(admin.ModelAdmin):
    list_display = ("subject", "code", "name", "module_order", "is_active")
    list_filter = ("subject", "is_active")
    search_fields = ("subject__name", "code", "name")


@admin.register(ALevelModuleAssessment)
class ALevelModuleAssessmentAdmin(admin.ModelAdmin):
    list_display = (
        "student",
        "subject",
        "component_type",
        "module",
        "competency_code",
        "points_awarded",
        "attempt_no",
        "is_retake",
        "assessed_on",
    )
    list_filter = ("policy", "component_type", "competency_code", "is_retake", "subject")
    search_fields = ("student__student_name", "student__reg_no", "subject__name", "module__code")
