from flask.views import MethodView
from flask_smorest import Blueprint
from src.views.attendance.utils import AttendanceManager
from flask import request

attendance_router = Blueprint("Attendance Management Routes", __name__)

@attendance_router.route("/attendance")
class AttendanceRouter(MethodView):
    def __init__(self) -> None:
        self.manager = AttendanceManager()

    @attendance_router.response(status_code=201)
    def post(self):
        """Create attendance records for a session"""
        payload = request.get_json()
        return self.manager.create(payload)

@attendance_router.route("/attendance/bulk-update")
class AttendanceBulkUpdateRouter(MethodView):
    def __init__(self) -> None:
        self.manager = AttendanceManager()

    @attendance_router.response(status_code=200)
    def put(self):
        """Bulk update attendance records"""

        payload = request.get_json()
        return self.manager.bulk_update(payload)

@attendance_router.route("/attendance/session/<string:session_id>")
class AttendanceSessionRouter(MethodView):
    def __init__(self) -> None:
        self.manager = AttendanceManager()

    @attendance_router.response(status_code=200)
    def get(self, session_id):
        """Get attendance records for a session"""
        return self.manager.get_session_attendance(session_id)

    @attendance_router.response(status_code=200)
    def post(self, session_id):
        """Approve attendance for a session"""
        payload = request.get_json()
        return self.manager.approve_attendance(session_id, payload)

@attendance_router.route("/attendance/student/<string:student_id>")
class AttendanceStudentRouter(MethodView):
    def __init__(self) -> None:
        self.manager = AttendanceManager()

    @attendance_router.response(status_code=200)
    def get(self, student_id):
        """Get attendance records for a student"""
        course_id = request.args.get('course_id')
        return self.manager.get_student_attendance(student_id, course_id)

@attendance_router.route("/attendance/course/<string:course_id>")
class AttendanceCourseRouter(MethodView):
    def __init__(self) -> None:
        self.manager = AttendanceManager()

    @attendance_router.response(status_code=200)
    def get(self, course_id):
        """Get attendance records for a course with pagination"""
        page = request.args.get('page', 1, type=int)
        per_page = request.args.get('per_page', 20, type=int)
        return self.manager.get_course_attendance(course_id, page, per_page)

@attendance_router.route("/attendance/<string:attendance_id>/dispute")
class AttendanceDisputeRouter(MethodView):
    def __init__(self) -> None:
        self.manager = AttendanceManager()

    @attendance_router.response(status_code=200)
    def post(self, attendance_id):
        """Dispute an attendance record"""
        payload = request.get_json()
        return self.manager.dispute_attendance(attendance_id, payload)

@attendance_router.route("/attendance/<string:attendance_id>/resolve")
class AttendanceResolveRouter(MethodView):
    def __init__(self) -> None:
        self.manager = AttendanceManager()

    @attendance_router.response(status_code=200)
    def post(self, attendance_id):
        """Resolve an attendance dispute"""
        payload = request.get_json()
        return self.manager.resolve_dispute(attendance_id, payload)

@attendance_router.route("/attendance/supervisor/<string:supervisor_id>/report")
class SupervisorAttendanceReportRouter(MethodView):
    def __init__(self) -> None:
        self.manager = AttendanceManager()

    @attendance_router.response(status_code=200)
    def get(self, supervisor_id):
        """Get comprehensive attendance report for a supervisor's students"""
        start_date = request.args.get('start_date')
        end_date = request.args.get('end_date')
        course_id = request.args.get('course_id')
        return self.manager.get_supervisor_attendance_report(supervisor_id, start_date, end_date, course_id)