from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.db import transaction
from .models import Admission, Qualification
import uuid


# ==============================
# CREATE ADMISSION
# ==============================
@login_required
@transaction.atomic
def admission_create(request):

    # 🔒 Only students allowed
    if request.user.user_type != 'student':
        messages.error(request, "Only students can apply for admission.")
        return redirect('student_dashboard')

    existing_admission = Admission.objects.filter(user=request.user).first()

    # 🔒 If already approved → block completely
    if existing_admission and existing_admission.status == "Approved":
        messages.warning(request, "Your admission is already approved. You cannot modify it.")
        return redirect("admissions:admission_success")

    # 🔒 If already submitted → redirect
    if existing_admission:
        messages.warning(request, "You have already submitted the admission form.")
        return redirect("admissions:admission_success")

    if request.method == "POST":

        if not request.POST.get("declaration"):
            messages.error(request, "You must accept declaration before submitting.")
            return render(request, "admissions/admission_form.html")

        admission = Admission.objects.create(
            user=request.user,
            name=request.POST.get('name'),
            father_name=request.POST.get('father_name'),
            mother_name=request.POST.get('mother_name'),
            present_address=request.POST.get('present_address'),
            permanent_address=request.POST.get('permanent_address'),
            same_as_present=request.POST.get('same_as_present') == 'on',
            date_of_birth=request.POST.get('date_of_birth'),
            category=request.POST.get('category'),
            disability=request.POST.get('disability'),
            udid=request.POST.get('udid'),
            aadhar_number=request.POST.get('aadhar_number'),
            aadhar_file=request.FILES.get('aadhar_file'),
            photo=request.FILES.get('photo'),
            email=request.POST.get('email'),
            mobile=request.POST.get('mobile'),
            alternate_mobile=request.POST.get('alternate_mobile'),
            gender=request.POST.get('gender'),
            medium=request.POST.get('medium'),
            guardian_name=request.POST.get('guardian_name'),
            relation=request.POST.get('relation'),
            guardian_mobile=request.POST.get('guardian_mobile'),
            guardian_alternate_mobile=request.POST.get('guardian_alternate_mobile'),
            coaching_exam=request.POST.get('coaching_exam'),
            coaching_year=request.POST.get('coaching_year'),
            declaration=True,
            status='Pending'
        )

        # ==============================
        # SAVE QUALIFICATIONS
        # ==============================
        qualifications_data = [
            {
                "type": "High School",
                "passing_year": request.POST.get("passing_year_10"),
                "marks": request.POST.get("marks_10"),
                "subject": request.POST.get("subject_10"),
                "board": request.POST.get("board_10"),
                "school": request.POST.get("school_10"),
                "marksheet": request.FILES.get("marksheet_10"),
            },
            {
                "type": "Higher Secondary",
                "passing_year": request.POST.get("passing_year_12"),
                "marks": request.POST.get("marks_12"),
                "subject": request.POST.get("subject_12"),
                "board": request.POST.get("board_12"),
                "school": request.POST.get("school_12"),
                "marksheet": request.FILES.get("marksheet_12"),
            },
            {
                "type": "Graduation",
                "passing_year": request.POST.get("passing_year_grad"),
                "marks": request.POST.get("marks_grad"),
                "subject": request.POST.get("subject_grad"),
                "board": request.POST.get("board_grad"),
                "school": request.POST.get("school_grad"),
                "marksheet": request.FILES.get("marksheet_grad"),
            }
        ]

        for q in qualifications_data:
            if q["passing_year"] or q["marksheet"]:
                Qualification.objects.create(
                    admission=admission,
                    qualification_type=q["type"],
                    passing_year=q["passing_year"],
                    marks=q["marks"],
                    subject_stream=q["subject"],
                    board_university=q["board"],
                    school_college=q["school"],
                    marksheet=q["marksheet"],
                )

        messages.success(request, "Admission submitted successfully. Waiting for approval.")
        return redirect("admissions:admission_success")

    return render(request, "admissions/admission_form.html")


# ==============================
# SUCCESS PAGE
# ==============================
@login_required
def admission_success(request):
    admission = Admission.objects.filter(user=request.user).first()
    return render(request, "admissions/success.html", {"admission": admission})


# ==============================
# ADMIN: VIEW ALL APPLICATIONS
# ==============================
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .models import Admission


@login_required
def admission_list(request):

    if request.user.user_type != "admin":
        return redirect("student_dashboard")

    # Handle Office Update
    if request.method == "POST":
        admission_id = request.POST.get("admission_id")
        admission = get_object_or_404(Admission, id=admission_id)

        admission.registration_fee = request.POST.get("registration_fee") or None
        admission.student_id = request.POST.get("student_id") or None
        admission.batch_time = request.POST.get("batch_time") or None
        admission.batch_number = request.POST.get("batch_number") or None
        admission.status = request.POST.get("status")

        admission.save()
        messages.success(request, "Application updated successfully.")
        return redirect("admissions:admission_list")

    # Filtering
    status_filter = request.GET.get("status")

    if status_filter:
        admissions = Admission.objects.filter(status=status_filter).order_by("-id")
    else:
        admissions = Admission.objects.all().order_by("-id")

    return render(
        request,
        "admissions/admission_list.html",
        {"admissions": admissions}
    )

# ==============================
# ADMIN: APPROVE / REJECT
# ==============================
@login_required
def update_admission_status(request, pk):

    if request.user.user_type != "admin":
        return redirect("student_dashboard")

    admission = Admission.objects.get(pk=pk)

    new_status = request.POST.get("status")

    if new_status in ["Approved", "Rejected"]:
        admission.status = new_status

        # 🔥 Auto-generate Student ID when approved
        if new_status == "Approved" and not admission.student_id:
            admission.student_id = f"STU-{uuid.uuid4().hex[:6].upper()}"

        admission.save()
        messages.success(request, f"Admission marked as {new_status}.")

    return redirect("admissions:admission_list")


# ==============================
# STUDENT: VIEW OWN APPLICATION
# ==============================
@login_required
def student_admission_list(request):

    if request.user.user_type != "student":
        return redirect("student_dashboard")

    admission = Admission.objects.filter(user=request.user).first()

    return render(
        request,
        'admissions/student_admission_list.html',
        {'admission': admission}
    )

@login_required
def update_admission_status(request, admission_id, status):
    if request.user.user_type != "admin":
        return redirect("student_dashboard")

    admission = Admission.objects.get(id=admission_id)
    admission.status = status
    admission.save()

    messages.success(request, f"Application {status} successfully.")
    return redirect("admissions:admission_list")