from flask.views import MethodView
from flask_smorest import Blueprint
from src.utils import custom_response
from src.views.enrollment.utils import EnrollmentManager
from flask import request
from src.models.schema import (
    EnrollmentSchema,
)

enrollment_router = Blueprint("Enrollment Management Routes", __name__, description="Operations related to enrollment management")

@enrollment_router.route("/enrollments")
class EnrollmentRouter(MethodView):
    def __init__(self) -> None:
        self.enrollment_manager = EnrollmentManager()

    @enrollment_router.response(status_code=200, schema=EnrollmentSchema(many=True))
    def get(self):
        """Get all enrollments with pagination and filtering"""
        page = request.args.get('page', 1, type=int)
        per_page = request.args.get('per_page', 20, type=int)
        filters = request.args.to_dict()
        return self.enrollment_manager.fetchAll(page=page, per_page=per_page, filters=filters)

    @enrollment_router.arguments(schema=EnrollmentSchema, location='json')
    @enrollment_router.response(status_code=201, schema=EnrollmentSchema)
    def post(self, payload):
        """Create a new enrollment"""
        return self.enrollment_manager.create(payload)

@enrollment_router.route("/enrollments/<string:enrollment_id>")
class EnrollmentDetailRouter(MethodView):
    def __init__(self) -> None:
        self.enrollment_manager = EnrollmentManager()

    @enrollment_router.response(status_code=200, schema=EnrollmentSchema)
    def get(self, enrollment_id):
        """Get detailed information about a specific enrollment"""
        return self.enrollment_manager.get(enrollment_id)

    @enrollment_router.arguments(schema=EnrollmentSchema, location='json')
    @enrollment_router.response(status_code=200, schema=EnrollmentSchema)
    def put(self, payload, enrollment_id):
        """Update enrollment information"""
        return self.enrollment_manager.update(enrollment_id, payload)

    @enrollment_router.response(status_code=200)
    def delete(self, enrollment_id):
        """Withdraw a student from a course (soft delete)"""
        return self.enrollment_manager.delete(enrollment_id)

@enrollment_router.route("/enrollments/template")
class EnrollmentTemplateRouter(MethodView):
    def __init__(self) -> None:
        self.enrollment_manager = EnrollmentManager()

    @enrollment_router.response(status_code=200)
    def get(self):
        """Download an Excel template for bulk enrollment upload"""
        return self.enrollment_manager.generate_upload_template()

@enrollment_router.route("/enrollments/bulk", methods=["POST"])
class BulkEnrollmentRouter(MethodView):
    def __init__(self) -> None:
        self.enrollment_manager = EnrollmentManager()

    def post(self):
        """Process bulk enrollment upload from Excel or CSV file"""
        file = request.files.get('file')
        if not file:
            return custom_response(
                success=False,
                data="No file uploaded",
                status_code=400
            )
        return self.enrollment_manager.process_bulk_upload(file)
    

@enrollment_router.route("/enrollments/analytics/<supervisor_id>", methods=["GET"])
class EnrollmentAnalyticsRouter(MethodView):
    def __init__(self) -> None:
        self.enrollment_manager = EnrollmentManager()

    def get(self, supervisor_id):
        return self.enrollment_manager.get_enrollment_analytics(
            supervisor_id=supervisor_id
        )