from flask import Blueprint, request, jsonify
from models.image import Image
from models.user import User
from datetime import datetime
from math import ceil
import os
from bson import ObjectId
from utils.jwt_service import jwt_required

image_routes = Blueprint('image_routes', __name__)

@image_routes.route('/get-image-detail', methods=['POST'])
@jwt_required
def get_single_image():
    user_id = getattr(request, "user_id", None)
    if request.method == "POST":
        data = request.get_json() or {}
        image_id = data.get('image_id')

        # Validation
        if not image_id:
            return jsonify({
                'status': False,
                'message': 'Enter image id'
            }), 400

        try:
            # Validate ObjectId
            image_obj = Image.objects(id=ObjectId(image_id)).first()
        except Exception:
            return jsonify({
                'status': False,
                'message': 'Invalid image id'
            }), 400

        if image_obj:
            base_url = request.host_url.replace("http://", "https://").rstrip('/')+'/public/images/uploads/'
            image_dict = image_obj.to_mongo().to_dict()
            image_dict['image'] = base_url + image_dict['image']

            # Convert all ObjectId fields to strings
            for k, v in list(image_dict.items()):
                if isinstance(v, ObjectId):
                    image_dict[k] = str(v)
            # Also handle '_id' as 'id'
            if '_id' in image_dict:
                image_dict['id'] = str(image_dict['_id'])
                del image_dict['_id']

            return jsonify({
                'status': True,
                'message': 'Fetching the image information',
                'images': image_dict
            }), 200
        else:
            return jsonify({
                'status': False,
                'message': 'No data found yet'
            }), 404
    else:
        return jsonify({
            'status': False,
            'message': 'Unauthorized method.'
        }), 401

@image_routes.route('/get-images', methods=['POST'])
@jwt_required
def get_images_list():
    # Ensure POST request
    user_id = getattr(request, "user_id", None)
    if request.method != 'POST':
        return jsonify({'status': False, 'message': 'Unauthorized method.'}), 401

    data = request.get_json() or {}
    # user_id = data.get('user_id')
    user_id = user_id

    # Validation
    if not user_id:
        return jsonify({'status': False, 'message': 'Enter user id'}), 400

    # Check if user exists
    user = User.objects(id=user_id).first()
    if not user:
        return jsonify({'status': False, 'message': 'User not found.'}), 404

    user_type = user.user_type

    # Pagination
    page = int(data.get('page', 1))
    per_page = int(data.get('per_page', 10))
    offset = (page - 1) * per_page

    # Fetch images
    images_query = Image.objects(user_id=user).order_by('-id')
    total_images = images_query.count()
    per_page= max(total_images, per_page)

    images_list = images_query.skip(offset).limit(per_page)

    if not images_list:
        return jsonify({'status': False, 'message': 'No data found yet'}), 500

    # Format response
    base_url = request.host_url.replace("http://", "https://").rstrip('/')+'/public/images/uploads/'

    formatted_images = []
    for img in images_list:
        img_dict = img.to_json()

        # Format created date
        created_dt = img.created_date
        if isinstance(created_dt, datetime):
            img_dict['created_date'] = created_dt.strftime('%d %b %Y')

        # Convert comma-separated images into URLs
        img_files = img.image.split(',') if img.image else []
        img_dict['image'] = [base_url + i for i in img_files]

        # Defaults for missing values
        img_dict['title'] = img_dict.get('title') or ''
        img_dict['subject_topic'] = img_dict.get('subject_topic') or ''

        if user_type == 'Teacher':
            quiz_date = created_dt.strftime('%d/%m/%Y') if created_dt else ''
            quiz_time = created_dt.strftime('%I:%M %p') if created_dt else ''
            img_dict['quiz_date'] = quiz_date
            img_dict['quiz_time'] = quiz_time
            img_dict['status'] = 'Not Yet Assigned'
            img_dict['attempted'] = 0
            img_dict['completed'] = 0

        formatted_images.append(img_dict)

    total_pages = ceil(total_images / per_page)

    return jsonify({
        'status': True,
        'message': 'Fetching the images list',
        'images': formatted_images,
        'pagination': {
            'current_page': page,
            'per_page': per_page,
            'total_items': total_images,
            'total_pages': total_pages
        }
    }), 200

@image_routes.route('/submit-image', methods=['POST'])
@jwt_required
def submit_image():
    user_id = getattr(request, "user_id", None)
    if request.method != 'POST':
        return jsonify({
            'status': False,
            'message': 'Unauthorized method.'
        }), 401

    data = request.json or {}
    path = data.get('path')
    title = data.get('title')
    subject_topic = data.get('subject_topic')

    # Validation
    if not path:
        return jsonify({'status': False, 'message': 'Enter path'}), 400
    if not title:
        return jsonify({'status': False, 'message': 'Enter title'}), 400
    if not subject_topic:
        return jsonify({'status': False, 'message': 'Enter subject/topic'}), 400

    # Look up Image by output_file
    image_record = Image.objects(output_file=path).only(
        'id', 'image', 'extracted_text', 'created_date'
    ).first()

    if image_record:
        # Update title and subject_topic
        image_record.update(set__title=title, set__subject_topic=subject_topic)
        image_record.reload()  # Refresh with updated data

        return jsonify({
            'status': True,
            'message': 'Image uploaded and text extracted successfully.',
            'output_file': path,
            'extracted_text': image_record.extracted_text
        }), 200
    else:
        return jsonify({
            'status': False,
            'message': 'No data found yet'
        }), 500