from flask import jsonify, g, session, request
from sqlalchemy import Select
from src import db
from src.models import StudentTable
from src.services.schools import find_school_by_id
from src.utils.response import error_response
from src.utils.rankings import update_student_rankings
from src.utils.decorators import handle_exceptions, token_required
from src.lib.jwt import verify_token


@handle_exceptions
@token_required(optional=True)  # Make JWT token optional
def current_user():
    """
    Priority:
    1. Student (SESSION based)
    2. JWT based users (teacher / principal / school)
    """

    # -------------------------
    # STUDENT (SESSION BASED) - CHECK FIRST
    # -------------------------
    student = session.get("student")
    
    if student:
        stmt = Select(StudentTable).where(StudentTable.id == student["id"])
        user = db.session.execute(stmt).scalar_one_or_none()

        if not user:
            return error_response("Student not found", 404)

        rankings = update_student_rankings(
            student_id=user.id,
            grade=user.grade,
            section=user.section,
            school_id=user.school_id
        )

        return jsonify({
            "success": True,
            "role": "student",
            "users": {
                "id": user.id,
                "username": user.username,
                "school_id": user.school_id,
                "grade": user.grade,
                "section": user.section,
            },
            "avatar": user.avatar,
            "coins": user.coins,
            "gems": user.gems,
            "streak": user.streak,
            "rankings": {
                "class": rankings["class_rankings"],
                "school": rankings["school_rankings"]
            }
        }), 200

    # -------------------------
    # JWT BASED USERS (set by decorator)
    # -------------------------
    if hasattr(g, "current_user") and hasattr(g, "current_role"):
        user = g.current_user
        role = g.current_role

        # TEACHER
        if role == "teacher":
            school = find_school_by_id(user.school_id)
            return jsonify({
                "success": True,
                "role": "teacher",
                "users": {
                    "id": user.id,
                    "username": user.username,
                    "school_name": school.school_name,
                    "stream": school.stream,
                    "grades": user.grades
                }
            }), 200

        # PRINCIPAL
        if role == "principal":
            school = find_school_by_id(user.school_id)
            return jsonify({
                "success": True,
                "role": "principal",
                "id": user.id,
                "school_id": user.school_id,
                "firstname": user.firstname,
                "lastname": user.lastname,
                "username": user.username,
                "school_name": school.school_name
            }), 200

        # SCHOOL
        if role == "school":
            return jsonify({
                "success": True,
                "role": "school",
                "id": user.id,
                "school_name": user.school_name,
                "school_id": user.school_id
            }), 200

    return error_response("No active user found", 401)