import io

import PyPDF2
import os

from PyPDF2 import PdfReader, PdfWriter


def optimize_pdf_with_images(input_file, destination_folder):
    # """ Optimize a PDF by reducing the size of embedded images while preserving all other content. """/

    optimized_pdf_path = os.path.join(destination_folder, os.path.basename(input_file))

    pdf_reader = PdfReader(input_file)
    pdf_writer = PdfWriter()

    for pdf_page in pdf_reader.pages:
        page_resources = pdf_page.get("/Resources")
        if page_resources:
            page_resources = page_resources.get_object()  # Resolve IndirectObject

        if "/XObject" in page_resources:
            image_objects = page_resources["/XObject"].get_object()

            for img_name in image_objects:
                img_obj = image_objects[img_name]

                if img_obj.get("/Subtype") == "/Image":

                    # Extract the image data
                    image_data = img_obj._data
                    image_stream = io.BytesIO(image_data)

                    # Compress the image
                    compressed_image_stream = compress_image_for_pdf(image_stream)

                    if compressed_image_stream is None:
                        print(f"Skipping invalid image: {img_name}")
                        continue  # Skip this image if compression failed

                    # Get new image dimensions
                    resized_image = Image.open(compressed_image_stream)
                    new_width, new_height = resized_image.size

                    # Create a new image object with compressed data
                    new_image_object = StreamObject()
                    new_image_object._data = compressed_image_stream.getvalue()
                    new_image_object.update({
                        NameObject("/Filter"): NameObject("/DCTDecode"),
                        NameObject("/Subtype"): NameObject("/Image"),
                        NameObject("/Width"): NumberObject(new_width),
                        NameObject("/Height"): NumberObject(new_height),
                        NameObject("/ColorSpace"): NameObject("/DeviceRGB"),
                        NameObject("/BitsPerComponent"): NumberObject(8),
                    })

                    # Replace the old image with the new one
                    image_objects[img_name] = new_image_object

        pdf_writer.add_page(pdf_page)

    pdf_reader.stream.close()

    print(f"PDF reader closed, now writing the optimized file.")
    print(f"optimized_pdf_path : {optimized_pdf_path}")  # Log the file path
    with open(optimized_pdf_path, "wb") as output_pdf:
        pdf_writer.write(output_pdf)

    print(f"Optimized PDF saved at: {optimized_pdf_path}")
    return optimized_pdf_path

optimize_pdf_with_images(r"u:\Dropbox\!!!Days\Downloads Z230\Dokumentace\6504140489 2025-03-04 Harsa, Radovan [PZ psychiatrie] [28FEB2025-04MAR2025 vágní suicidální proklamace, zbytečná hospitalizace].pdf",
                         r"u:\Dropbox\!!!Days\Downloads Z230\Dokumentace\Converted")