from flask import request, jsonify
from flask.views import MethodView
from .utils import AcademicSessionManager
from flask_smorest import Blueprint


academic_session_bp = Blueprint('academic_session', __name__)


@academic_session_bp.route('/academic-sessions')
class AcademicSessionRouter(MethodView):
    """Router for academic session operations"""
    
    def __init__(self):
        self.session_manager = AcademicSessionManager()
    
    def get(self):
        """Get all academic sessions or filter by speciality"""
        try:
            speciality_id = request.args.get('speciality_id')
            
            if speciality_id:
                sessions = self.session_manager.get_sessions_by_speciality(speciality_id)
            else:
                sessions = self.session_manager.get_all_sessions()
            
            return jsonify({
                'success': True,
                'data': {
                    'academic_sessions': sessions
                }
            }), 200
        except Exception as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 500
    
    def post(self):
        """Create a new academic session"""
        try:
            data = request.get_json()
            requester_id = data.get('requester_id')
            
            if not requester_id:
                return jsonify({
                    'success': False,
                    'message': 'Requester ID is required'
                }), 400
            
            session = self.session_manager.create_session(data)
            
            return jsonify({
                'success': True,
                'data': {
                    'academic_session': session
                }
            }), 201
        except Exception as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 500
        

@academic_session_bp.route('/academic-sessions/<session_id>')
class AcademicSessionDetailRouter(MethodView):
    """Router for individual academic session operations"""
    
    def __init__(self):
        self.session_manager = AcademicSessionManager()
    
    def get(self, id):
        """Get a specific academic session by ID"""
        try:
            session = self.session_manager.get_session_by_id(id)
            
            if not session:
                return jsonify({
                    'success': False,
                    'message': 'Academic session not found'
                }), 404
            
            return jsonify({
                'success': True,
                'data': {
                    'academic_session': session
                }
            }), 200
        except Exception as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 500
    
    def put(self, id):
        """Update an academic session"""
        try:
            data = request.get_json()
            session = self.session_manager.update_session(id, data)
            
            if not session:
                return jsonify({
                    'success': False,
                    'message': 'Academic session not found'
                }), 404
            
            return jsonify({
                'success': True,
                'data': {
                    'academic_session': session
                }
            }), 200
        except Exception as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 500
    
    def delete(self, id):
        """Delete an academic session"""
        try:
            # For DELETE requests, we don't need a JSON body
            # Try to get requester_id from query params or use default
            requester_id = request.args.get('requester_id') or 'system'
            
            success = self.session_manager.delete_session(id, requester_id)
            
            if not success:
                return jsonify({
                    'success': False,
                    'message': 'Academic session not found'
                }), 404
            
            return jsonify({
                'success': True,
                'message': 'Academic session deleted successfully'
            }), 200
        except Exception as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 500

class AcademicSessionStudentsRouter(MethodView):
    """Router for managing students in academic sessions"""
    
    def __init__(self):
        self.session_manager = AcademicSessionManager()
    
    def get(self, session_id):
        """Get all students enrolled in an academic session"""
        try:
            students = self.session_manager.get_students_in_session(session_id)
            
            return jsonify({
                'success': True,
                'data': {
                    'students': students
                }
            }), 200
        except Exception as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 500
    
    def post(self, session_id):
        """Enroll a student in an academic session"""
        try:
            data = request.get_json()
            student_id = data.get('student_id')
            
            if not student_id:
                return jsonify({
                    'success': False,
                    'message': 'Student ID is required'
                }), 400
            
            success = self.session_manager.enroll_student_in_session(session_id, student_id, data)
            
            if success:
                return jsonify({
                    'success': True,
                    'message': 'Student enrolled successfully'
                }), 201
            else:
                return jsonify({
                    'success': False,
                    'message': 'Failed to enroll student'
                }), 500
        except ValueError as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 400
        except Exception as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 500

class AcademicSessionStudentDetailRouter(MethodView):
    """Router for managing individual student enrollments in academic sessions"""
    
    def __init__(self):
        self.session_manager = AcademicSessionManager()
    
    def put(self, session_id, student_id):
        """Update a student's enrollment in an academic session"""
        try:
            data = request.get_json()
            success = self.session_manager.update_student_enrollment(session_id, student_id, data)
            
            if success:
                return jsonify({
                    'success': True,
                    'message': 'Enrollment updated successfully'
                }), 200
            else:
                return jsonify({
                    'success': False,
                    'message': 'No changes made to enrollment'
                }), 200
        except Exception as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 500
    
    def delete(self, session_id, student_id):
        """Withdraw a student from an academic session"""
        try:
            data = request.get_json()
            withdrawal_reason = data.get('withdrawal_reason')
            
            success = self.session_manager.withdraw_student_from_session(session_id, student_id, withdrawal_reason)
            
            if success:
                return jsonify({
                    'success': True,
                    'message': 'Student withdrawn successfully'
                }), 200
            else:
                return jsonify({
                    'success': False,
                    'message': 'Failed to withdraw student'
                }), 500
        except Exception as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 500

class AcademicSessionStatsRouter(MethodView):
    """Router for academic session statistics"""
    
    def __init__(self):
        self.session_manager = AcademicSessionManager()
    
    def get(self, session_id):
        """Get enrollment statistics for an academic session"""
        try:
            stats = self.session_manager.get_session_enrollment_stats(session_id)
            
            return jsonify({
                'success': True,
                'data': {
                    'enrollment_stats': stats
                }
            }), 200
        except Exception as e:
            return jsonify({
                'success': False,
                'message': str(e)
            }), 500

# Register routes
academic_session_bp.add_url_rule('/academic-sessions', view_func=AcademicSessionRouter.as_view('academic_sessions'), methods=['GET', 'POST'])
academic_session_bp.add_url_rule('/academic-sessions/<id>', view_func=AcademicSessionDetailRouter.as_view('academic_session_detail'), methods=['GET', 'PUT', 'DELETE'])
academic_session_bp.add_url_rule('/academic-sessions/<session_id>/students', view_func=AcademicSessionStudentsRouter.as_view('academic_session_students'), methods=['GET', 'POST'])
academic_session_bp.add_url_rule('/academic-sessions/<session_id>/students/<student_id>', view_func=AcademicSessionStudentDetailRouter.as_view('academic_session_student_detail'), methods=['PUT', 'DELETE'])
academic_session_bp.add_url_rule('/academic-sessions/<session_id>/stats', view_func=AcademicSessionStatsRouter.as_view('academic_session_stats'), methods=['GET']) 