# Import necessary libraries
import sys
import copy
from typing import Tuple
from PIL import Image
import supervision as sv

# Local imports
from src.utils.processing import clean_text, draw_ocr_bboxes
from src.app.model import run_example
from src.logger import logging
from src.exception import CustomExceptionHandling


def ocr_task(image: Image.Image) -> Tuple[Image.Image, str]:
    """
    Perform OCR (Optical Character Recognition) on the given image.

    Args:
        image (PIL.Image.Image): The input image to perform OCR on.

    Returns:
        tuple: A tuple containing the output image with OCR bounding boxes drawn and the cleaned OCR text.
    """
    try:
        # Task prompts
        ocr_prompt = "<OCR>"
        ocr_with_region_prompt = "<OCR_WITH_REGION>"

        # Get OCR text
        ocr_results = run_example(ocr_prompt, image)
        cleaned_text = clean_text(ocr_results["<OCR>"])

        # Log the successful extraction and cleaning of OCR text
        logging.info("OCR text extracted and cleaned successfully.")

        # Get OCR with region
        ocr_with_region_results = run_example(ocr_with_region_prompt, image)
        output_image = copy.deepcopy(image)
        detections = sv.Detections.from_lmm(
            lmm=sv.LMM.FLORENCE_2,
            result=ocr_with_region_results,
            resolution_wh=image.size,
        )
        output_image = draw_ocr_bboxes(image, detections)

        # Log the successful drawing of OCR bounding boxes
        logging.info("OCR bounding boxes drawn successfully.")

        # Return the output image and cleaned OCR text
        return output_image, cleaned_text

    # Handle exceptions that may occur during the process
    except Exception as e:
        # Custom exception handling
        raise CustomExceptionHandling(e, sys) from e