from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, get_user_model
from django.http import JsonResponse
from django.views.decorators.http import require_GET
from django.db.models import Avg, Count
from django.views.decorators.csrf import csrf_exempt

from django.contrib import admin


from .models import (
    Region, District, Ward, School,
    ExamType, ExamSubject,
    ExamCandidate, StudentSubjectMark,
    SchoolYearSummary, UserProfile
)

User = get_user_model()


# --------------------------------------------------------------
# AUTH VIEWS
# --------------------------------------------------------------
def register_page(request):
    if request.method == "POST":
        username = request.POST.get("username")
        email = request.POST.get("email")
        password = request.POST.get("password")

        if User.objects.filter(username=username).exists():
            return render(request, "exams/register.html", {
                "error": "Username already exists"
            })

        User.objects.create_user(username=username, email=email, password=password)
        return render(request, "exams/register.html", {
            "message": "User registered successfully!"
        })

    return render(request, "exams/register.html")


def login_view(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")

        user = authenticate(username=username, password=password)
        if user:
            login(request, user)
            return redirect("exams:dashboard")

        return render(request, "exams/login.html", {
            "error": "Invalid username or password."
        })

    return render(request, "exams/login.html")


# --------------------------------------------------------------
# DASHBOARD VIEW
# --------------------------------------------------------------
@login_required
def dashboard(request):
    return render(request, "exams/dashboard.html", {
        "regions": Region.objects.all(),
        "exam_types": ExamType.objects.all(),
        "subjects": ExamSubject.objects.all(),
        "user_profile": getattr(request.user, "profile", None),
    })


# --------------------------------------------------------------
# CASCADE DROPDOWNS
# --------------------------------------------------------------
@login_required
def ajax_get_districts(request, region_id):
    items = District.objects.filter(region_id=region_id).values("id", "name")
    return JsonResponse(list(items), safe=False)


@login_required
def ajax_get_wards(request, district_id):
    items = Ward.objects.filter(district_id=district_id).values("id", "name")
    return JsonResponse(list(items), safe=False)


@login_required
def ajax_get_schools(request, ward_id):
    items = School.objects.filter(ward_id=ward_id).values("school_code", "name")
    return JsonResponse(list(items), safe=False)


# --------------------------------------------------------------
# MAIN DASHBOARD API (Modernized for NEW MODELS)
# --------------------------------------------------------------
@login_required
@require_GET
def ajax_dashboard_data(request):
    region = request.GET.get("region")
    district = request.GET.get("district")
    ward = request.GET.get("ward")
    school = request.GET.get("school")
    examtype = request.GET.get("examtype")
    start_year = request.GET.get("start_year")
    end_year = request.GET.get("end_year")
    subject_id = request.GET.get("subject")

    # ----------------------------------------------------------
    # BASE QUERY: ExamCandidate
    # ----------------------------------------------------------
    qs = ExamCandidate.objects.select_related("school", "exam_type").all()

    # FILTERS
    if region:
        qs = qs.filter(school__region_id=region)
    if district:
        qs = qs.filter(school__district_id=district)
    if ward:
        qs = qs.filter(school__ward_id=ward)
    if school:
        qs = qs.filter(school_id=school)
    if examtype:
        qs = qs.filter(exam_type_id=examtype)
    if start_year:
        qs = qs.filter(year__gte=int(start_year))
    if end_year:
        qs = qs.filter(year__lte=int(end_year))

    # ROLE BASED
    profile = getattr(request.user, "profile", None)
    if profile and profile.role != "super":
        if profile.role == "region":
            qs = qs.filter(school__region_id=profile.region_id)
        elif profile.role == "district":
            qs = qs.filter(school__district_id=profile.district_id)
        elif profile.role == "ward":
            qs = qs.filter(school__ward_id=profile.ward_id)
        elif profile.role == "school":
            qs = qs.filter(school_id=profile.school_id)

    # ----------------------------------------------------------
    # METRICS
    # ----------------------------------------------------------
    total_students = qs.count()

    avg_grade_points = qs.aggregate(avg=Avg("avg_numeric"))["avg"] or 0

    top_schools_raw = (
        qs.values("school__name")
        .annotate(avg_grade=Avg("avg_numeric"), count=Count("id"))
        .order_by("-avg_grade")[:5]
    )

    top_schools = [
        {
            "school": r["school__name"],
            "avg": round(float(r["avg_grade"] or 0), 2),
            "count": r["count"]
        }
        for r in top_schools_raw
    ]

    PASS_THRESHOLD = 3.0  # adjust if needed

    pass_count = qs.filter(avg_numeric__gte=PASS_THRESHOLD).count()
    fail_count = total_students - pass_count

    per_year = (
        qs.values("year")
        .annotate(avg_grade=Avg("avg_numeric"))
        .order_by("year")
    )

    years = [x["year"] for x in per_year]
    avg_series = [float(x["avg_grade"] or 0) for x in per_year]

    # ----------------------------------------------------------
    # SUBJECT FILTER (new table StudentSubjectMark)
    # ----------------------------------------------------------
    subject_series = {}
    if subject_id:
        marks = StudentSubjectMark.objects.filter(
            school__in=qs.values("school"),
            exam_type__in=qs.values("exam_type"),
            year__in=qs.values("year"),
            subject_id=subject_id
        )

        per_year_sub = (
            marks.values("year")
            .annotate(avg=Avg("numeric_score"))
            .order_by("year")
        )

        subject_series = {
            "years": [i["year"] for i in per_year_sub],
            "avg_marks": [float(i["avg"] or 0) for i in per_year_sub]
        }

    # ----------------------------------------------------------
    return JsonResponse({
        "cards": [
            {"title": "Total Candidates", "value": total_students},
            {"title": "Avg Grade Points", "value": round(avg_grade_points, 2)},
            {"title": "Pass %", "value": f"{round((pass_count / max(total_students,1))*100,1)}%"},
        ],
        "donut": [
            {"name": "Pass", "value": pass_count},
            {"name": "Fail", "value": fail_count},
        ],
        "line": {"years": years, "avg_marks": avg_series},
        "subject": subject_series,
        "top_schools": top_schools,
        "total_records": total_students
    }, safe=False)


@admin.register(ExamSubject)
class ExamSubjectAdmin(admin.ModelAdmin):
    list_display = (
        "subject_code",
        "subject_name_eng",
        "color_code",
        "is_active",
    )
    list_editable = ("color_code",)


