from flask import request, jsonify, Blueprint
from utils.jwt_service import jwt_required
from models.video_courses_model import VideoCourseSubject, SubjectVideo
from bson import ObjectId
from models.course import Course
from models.user_course_purchase_history import UserCoursePurchase
from datetime import datetime

video_courses_bp = Blueprint("video_courses", __name__)

@video_courses_bp.route('/get_videos_subjects', methods=['POST'])
@jwt_required
def get_video_course_subjects():
    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
        course_id = request.json.get('course_id')
        if not course_id or not user_id:
            return jsonify({"status": False, "message": "course_id and user_id are required"}), 400

        # Fetch course details from MetaData as per user_id
        course_details= Course.objects(id=ObjectId(course_id), status=1).first()
        is_purchased = 0
        is_expired = 0
        if user_id:
            purchase = UserCoursePurchase.objects(
                user_id=ObjectId(user_id),
                course_id=course_details.id,
                status=1
            ).first()
            if purchase:
                is_purchased = 1
                # Example expiry logic: course expires after 365 days
                expiry_days = course_details.duration
                if purchase.purchase_date and (datetime.utcnow() - purchase.purchase_date).days > expiry_days:
                    is_expired = 1

        # Only allow access if purchased and not expired
        if not is_purchased:
            return jsonify({"status": False, "message": "Course not purchased"}), 403
        if is_expired:
            return jsonify({"status": False, "message": "Course access has expired"}), 403
        
        subjects = VideoCourseSubject.objects(course_id=ObjectId(course_id), status=1)
        result = [{
            "subject_id": str(subject.id),
            "subject_name": subject.subject_name,
            "total_videos": SubjectVideo.objects(subject_id=subject.id, status=1).count(),
            "created_date": subject.created_date.isoformat()
        } for subject in subjects]

        return jsonify({
            "status": True,
            "is_purchased": is_purchased,
            "is_expired": is_expired,
            "data": result
        }), 200

    except Exception as e:
        return jsonify({"status": False, "message": str(e)}), 500

@video_courses_bp.route('/subject_videos', methods=['POST'])
@jwt_required
def get_subject_videos():
    try:
        subject_id= request.json.get("subject_id")
        if not ObjectId.is_valid(subject_id):
            return jsonify({"status": False, "message": "Invalid subject ID"}), 400

        videos = SubjectVideo.objects(subject_id=subject_id, status=1)
        result = [{
            "video_id": str(video.id),
            "video_title": video.video_title,
            "video_duration": video.video_duration,
            "video_path": video.video_path,
            "created_date": video.created_date.isoformat()
        } for video in videos]

        return jsonify({"status": True, "data": result}), 200

    except Exception as e:
        return jsonify({"status": False, "message": str(e)}), 500