from flask.views import MethodView
from flask_smorest import Blueprint
from src.views.course_level.utils import CourseLevelManager
from flask import request

course_level_router = Blueprint("Course Level Management Routes", __name__, description="Operations on course levels")

@course_level_router.route("/course-levels")
class CourseLevelRouter(MethodView):
    def __init__(self) -> None:
        self.level_manager = CourseLevelManager()

    def get(self):
        """Get list of course levels with pagination"""
        course_id = request.args.get('course_id', type=str)
        page = request.args.get('page', 1, type=int)
        per_page = request.args.get('per_page', 10, type=int)
        
        if not course_id:
            return {"message": "course_id parameter is required"}, 400
            
        return self.level_manager.fetch_all(course_id, page, per_page)

    def post(self):
        """Create a new course level"""
        payload = request.get_json()
        return self.level_manager.create(payload)

@course_level_router.route("/course-levels/<string:level_id>")
class CourseLevelDetailRouter(MethodView):
    def __init__(self) -> None:
        self.level_manager = CourseLevelManager()

    def get(self, level_id):
        """Get course level details"""
        return self.level_manager.get(level_id)

    def put(self, level_id):
        """Update course level details"""
        payload = request.get_json()
        return self.level_manager.update(level_id, payload)

    def delete(self, level_id):
        """Delete a course level"""
        requester_id = request.args.get('requester_id', type=str)
        if not requester_id:
            return {"message": "requester_id parameter is required"}, 400
        return self.level_manager.delete(level_id, requester_id)

@course_level_router.route("/courses/<string:course_id>/levels")
class CourseLevelsByCourseRouter(MethodView):
    def __init__(self) -> None:
        self.level_manager = CourseLevelManager()

    def get(self, course_id):
        """Get all levels for a specific course"""
        user_id = request.args.get('user_id', type=str)
        user_type = request.args.get('user_type', type=str)
        
        if not user_id or not user_type:
            return {"message": "user_id and user_type parameters are required"}, 400
            
        return self.level_manager.get_by_course(course_id, user_id, user_type)
