from flask.views import MethodView
from flask_smorest import Blueprint
from src.views.coursemodule.utils import CourseModuleManager
from flask import request

module_router = Blueprint("Course Module Routes", __name__, description="Operations on course modules")

@module_router.route("/courses/<string:course_id>/modules")
class CourseModuleListRouter(MethodView):
    def __init__(self) -> None:
        self.module_manager = CourseModuleManager()

    def get(self, course_id):
        """
        Get all modules for a course
        - Include unpublished modules for tutors/supervisors
        """

        include_unpublished = request.args.get('include_unpublished', True, type=bool)
        
        return self.module_manager.get_course_modules(
            course_id, 
            include_unpublished=include_unpublished
        )

    def post(self, course_id):
        """
        Create a new course module
        - Supervisor/tutor only
        """
        payload = request.get_json()
        payload['course_id'] = course_id
        return self.module_manager.create_module(payload)

@module_router.route("/courses/<string:course_id>/modules/<string:module_id>")
class CourseModuleDetailRouter(MethodView):
    def __init__(self) -> None:
        self.module_manager = CourseModuleManager()

    def get(self, course_id, module_id):
        """Get module details"""
        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.module_manager.get_module(module_id)

    def put(self, course_id, module_id):
        """Update module details"""
        requester_id = request.args.get('requester_id', type=str)
        requester_type = request.args.get('requester_type', type=str)
        payload = request.get_json()
        
        if not requester_id or not requester_type:
            return {"message": "requester_id and requester_type parameters are required"}, 400
            
        return self.module_manager.update_module(module_id, payload)

    @module_router.response(status_code=204)
    def delete(self, course_id, module_id):
        """Delete a module"""
        requester_id = request.args.get('requester_id', type=str)
        requester_type = request.args.get('requester_type', type=str)
        
        if not requester_id or not requester_type:
            return {"message": "requester_id and requester_type parameters are required"}, 400
            
        return self.module_manager.delete_module(
            module_id,
            notify_users=request.args.get('notify_users', True, type=bool)
        )

@module_router.route("/courses/<string:course_id>/modules/<string:module_id>/publish")
class CourseModulePublishRouter(MethodView):
    def __init__(self) -> None:
        self.module_manager = CourseModuleManager()

    def post(self, course_id, module_id):
        """Publish a module to make it visible to students"""
        requester_id = request.args.get('requester_id', type=str)
        requester_type = request.args.get('requester_type', type=str)
        
        if not requester_id or not requester_type:
            return {"message": "requester_id and requester_type parameters are required"}, 400
            
        return self.module_manager.publish_module(
            module_id,
            notify_users=request.args.get('notify_users', True, type=bool)
        )

@module_router.route("/courses/<string:course_id>/modules/<string:module_id>/progress")
class CourseModuleProgressRouter(MethodView):
    def __init__(self) -> None:
        self.module_manager = CourseModuleManager()

    def get(self, course_id, module_id):
        """Get module progress statistics"""
        user_id = request.args.get('user_id', type=str)
        user_type = request.args.get('user_type', type=str)
        student_id = request.args.get('student_id', type=str)
        
        if not user_id or not user_type:
            return {"message": "user_id and user_type parameters are required"}, 400
            
        return self.module_manager.get_module_progress(
            module_id,
            student_id=student_id
        )

# Additional routes for the new frontend structure
@module_router.route("/course-modules")
class CourseModuleCRUDRouter(MethodView):
    def __init__(self) -> None:
        self.module_manager = CourseModuleManager()

    def post(self):
        """Create a new course module"""
        payload = request.get_json()
        requester_id = request.args.get('requester_id', type=str)
        
        if not requester_id:
            return {"message": "requester_id parameter is required"}, 400
            
        payload['requester_id'] = requester_id
        return self.module_manager.create_module_new(payload)

@module_router.route("/course-modules/<string:module_id>")
class CourseModuleDetailCRUDRouter(MethodView):
    def __init__(self) -> None:
        self.module_manager = CourseModuleManager()

    def put(self, module_id):
        """Update module details"""
        requester_id = request.args.get('requester_id', type=str)
        payload = request.get_json()
        
        if not requester_id:
            return {"message": "requester_id parameter is required"}, 400
            
        payload['requester_id'] = requester_id
        return self.module_manager.update_module_new(module_id, payload)

    def delete(self, module_id):
        """Delete a module"""
        requester_id = request.args.get('requester_id', type=str)
        
        if not requester_id:
            return {"message": "requester_id parameter is required"}, 400
            
        return self.module_manager.delete_module_new(module_id, requester_id)

@module_router.route("/course-modules/by-course/<string:course_id>")
class CourseModuleByCourseRouter(MethodView):
    def __init__(self) -> None:
        self.module_manager = CourseModuleManager()

    def get(self, course_id):
        """Get all modules for a course"""
        requester_id = request.args.get('requester_id', type=str)
        
        if not requester_id:
            return {"message": "requester_id parameter is required"}, 400
            
        return self.module_manager.get_modules_by_course(course_id, requester_id)