import argparse
import os
import sqlite3
from pathlib import Path
from PIL import Image
import httpx

def optimize_image(image_path: Path, quality: int, max_width: int, max_height: int) -> bool:
    """
    Compresses and resizes an image.

    Args:
        image_path: Path to the image file.
        quality: JPEG quality (0-100) or WebP quality (0-100).  PNG uses compression level.
        max_width: Maximum width of the resized image.
        max_height: Maximum height of the resized image.

    Returns:
        True if the image was successfully optimized, False otherwise.
    """
    try:
        img = Image.open(image_path)
        width, height = img.size

        if width <= max_width and height <= max_height:
            print(f"Image {image_path} already within size limits. Skipping resize.")
            img.save(image_path, optimize=True)  # Optimize existing image if within limits
            return True

        img.thumbnail((max_width, max_height))

        if image_path.suffix.lower() == ".jpg" or image_path.suffix.lower() == ".jpeg":
            img.save(image_path, "JPEG", optimize=True, quality=quality)
        elif image_path.suffix.lower() == ".png":
            img.save(image_path, "PNG", optimize=True, quality=quality)
        elif image_path.suffix.lower() == ".webp":
            img.save(image_path, "WEBP", optimize=True, quality=quality)
        else:
            print(f"Unsupported image format: {image_path.suffix}")
            return False
        return True
    except Exception as e:
        print(f"Error processing {image_path}: {e}")
        return False


def process_directory(directory: Path, quality: int, max_width: int, max_height: int, recursive: bool) -> None:
    """
    Processes all images in a directory and its subdirectories (if recursive).

    Args:
        directory: Path to the directory.
        quality: JPEG/WebP quality or PNG compression level.
        max_width: Maximum width of the resized images.
        max_height: Maximum height of the resized images.
        recursive: Whether to process subdirectories as well.
    """
    for item in directory.rglob("*") if recursive else directory.iterdir():
        if item.is_file():
            if item.suffix.lower() in (".jpg", ".jpeg", ".png", ".webp"):
                if optimize_image(item, quality, max_width, max_height):
                    print(f"Optimized: {item}")
            else:
                print(f"Skipping non-image file: {item}")


def main() -> None:
    """
    Main function to parse arguments and run the image optimizer.
    """
    parser = argparse.ArgumentParser(description="Compress and resize images for web.")
    parser.add_argument("input_path", type=Path, help="Path to the image or directory.")
    parser.add_argument("-q", "--quality", type=int, default=85, help="JPEG/WebP quality (0-100) or PNG compression level (default: 85).")
    parser.add_argument("-w", "--max_width", type=int, default=1920, help="Maximum width of the resized images (default: 1920).")
    parser.add_argument("-h", "--max_height", type=int, default=1080, help="Maximum height of the resized images (default: 1080).")
    parser.add_argument("-r", "--recursive", action="store_true", help="Process directories recursively.")

    args = parser.parse_args()

    if not 0 <= args.quality <= 100:
        print("Error: Quality must be between 0 and 100.")
        return

    if args.input_path.is_file():
        if optimize_image(args.input_path, args.quality, args.max_width, args.max_height):
            print(f"Optimized: {args.input_path}")
    elif args.input_path.is_dir():
        process_directory(args.input_path, args.quality, args.max_width, args.max_height, args.recursive)
    else:
        print(f"Error: Invalid input path: {args.input_path}")


if __name__ == "__main__":
    main()