from flask.views import MethodView
from flask_smorest import Blueprint
from src.views.course_week.utils import CourseWeekManager
from flask import request

course_week_router = Blueprint("Course Week Management Routes", __name__, description="Operations on course weeks")

@course_week_router.route("/course-weeks")
class CourseWeekRouter(MethodView):
    def __init__(self) -> None:
        self.week_manager = CourseWeekManager()

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

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

@course_week_router.route("/course-weeks/<string:week_id>")
class CourseWeekDetailRouter(MethodView):
    def __init__(self) -> None:
        self.week_manager = CourseWeekManager()

    def get(self, week_id):
        """Get course week details"""
        return self.week_manager.get(week_id)

    def put(self, week_id):
        """Update course week details"""
        payload = request.get_json()
        return self.week_manager.update(week_id, payload)

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

@course_week_router.route("/course-levels/<string:level_id>/weeks")
class CourseWeeksByLevelRouter(MethodView):
    def __init__(self) -> None:
        self.week_manager = CourseWeekManager()

    def get(self, level_id):
        """Get all weeks for a specific course level"""
        return self.week_manager.get_by_level(level_id)
