from flask import Blueprint, request, jsonify
from models.course import Course
from models.sub_exam import SubExam
from models.video_courses_model import VideoCourseSubject
from models.ebooks_model import Ebook
from models.mock_test_model import MockTest
from models.old_papers_model import OldPapers
from models.user_course_purchase_history import UserCoursePurchase
from datetime import datetime
from bson import ObjectId
from utils.jwt_service import jwt_required

courses_bp = Blueprint('courses', __name__)

@courses_bp.route('/get_courses_list/<string:sub_exam_id>', methods=['GET'])
@jwt_required
def get_courses_list(sub_exam_id):
    try:
        # Ensure sub_exam_id is a valid ObjectId
        if not ObjectId.is_valid(sub_exam_id):
            return jsonify({
                "status": "false",
                "message": "Invalid sub-exam ID",
                "data": []
            }), 400
        
        courses = Course.objects(sub_exam_id=sub_exam_id, status=1).order_by('position')
        if not courses:
            return jsonify({
                "status": "false",
                "message": "No courses found for this sub-exam",
                "data": []
            }), 404

        result=[]
        for course in courses:
            video_count = VideoCourseSubject.objects(course_id=course.id, status=1).count()
            ebook_count = Ebook.objects(course_id=course.id, status=1).count()
            mock_test_count = MockTest.objects(course_id=course.id, status=1).count()
            old_papers_count = OldPapers.objects(course_id=course.id, status=1).count()
            result.append({
                "id": str(course.id),
                "name": course.course_title,
                "fee": course.course_fee,
                "discounted_fee": course.discounted_fee,  # Added discounted_fee
                "duration": course.duration,                # Added duration
                "icon": course.course_image,
                "video_count": video_count,
                "ebook_count": ebook_count,
                "mock_test_count": mock_test_count,
                "old_papers_count": old_papers_count
            })

        return jsonify({
            "status": "true",
            "message": "Courses list fetched successfully",
            "data": result
        }), 200

    except Exception as e:
        return jsonify({
            "status": "false",
            "message": f"An error occurred: {str(e)}",
            "data": []
        }), 500

@courses_bp.route('/get_course_details', methods=['POST'])
@jwt_required
def get_course_details():
    try:
        # Get user_id from JWT (assuming jwt_required sets request.user)
        user_id = getattr(request, "user_id", None)
        if not user_id:
            return jsonify({"status": False, "message": "Invalid user id"}), 401
        data = request.get_json()
        course_id = data.get('course_id')

        if not course_id or not ObjectId.is_valid(course_id):
            return jsonify({
                "status": "false",
                "message": "Invalid or missing course ID",
                "data": {}
            }), 400

        course = Course.objects(id=course_id, status=1).first()
        if not course:
            return jsonify({
                "status": "false",
                "message": "Course not found",
                "data": {}
            }), 404

        # Add counts and discounted_fee to course details
        video_count = VideoCourseSubject.objects(course_id=course.id, status=1).count()
        ebook_count = Ebook.objects(course_id=course.id, status=1).count()
        mock_test_count = MockTest.objects(course_id=course.id, status=1).count()
        old_papers_count = OldPapers.objects(course_id=course.id, status=1).count()
        course_json = course.to_json()
        course_json["video_count"] = video_count
        course_json["ebook_count"] = ebook_count
        course_json["mock_test_count"] = mock_test_count
        course_json["old_papers_count"] = old_papers_count

        # Check purchase status
        is_purchased = 0
        is_expired = 0
        if user_id:
            purchase = UserCoursePurchase.objects(
                user_id=ObjectId(user_id),
                course_id=course.id,
                status=1
            ).order_by('-purchase_date').first()
            if purchase:
                is_purchased = 1
                # Example expiry logic: course expires after 365 days
                expiry_days = course.duration
                if purchase.purchase_date and (datetime.utcnow() - purchase.purchase_date).days > expiry_days:
                    is_expired = 1

        course_json["is_purchased"] = is_purchased
        course_json["is_expired"] = is_expired


        return jsonify({
            "status": "true",
            "message": "Course details fetched successfully",
            "data": course_json
        }), 200
    
    except Exception as e:
        return jsonify({
            "status": "false",
            "message": f"An error occurred: {str(e)}",
            "data": {}
        }), 500
