#!/usr/bin/env python3
"""
clean_image.py — Strip AI metadata + humanize generated images

Usage:
  python3 clean_image.py image.png
  python3 clean_image.py image.png --out cleaned.png
  python3 clean_image.py *.png   (glob via shell)

What it does:
  1. Strips ALL EXIF/metadata (removes Gemini/AI generator fingerprint)
  2. Adds subtle film grain (breaks AI pattern recognition)
  3. Micro-adjusts brightness/contrast/saturation (natural variation)
  4. Re-encodes with standard JPEG compression (phone-like pipeline)
  5. Saves as both .png (clean) and .jpg (social-ready)
"""

import sys
import os
import random
import argparse
from pathlib import Path

try:
    from PIL import Image, ImageFilter, ImageEnhance
    import numpy as np
except ImportError:
    print("Installing dependencies...")
    os.system("pip install Pillow numpy -q")
    from PIL import Image, ImageFilter, ImageEnhance
    import numpy as np


def add_grain(img, intensity=8):
    """Add subtle film grain to break AI pattern signatures."""
    arr = np.array(img, dtype=np.float32)
    noise = np.random.normal(0, intensity, arr.shape)
    arr = np.clip(arr + noise, 0, 255).astype(np.uint8)
    return Image.fromarray(arr)


def humanize(img):
    """Apply micro-adjustments that simulate real human photo editing."""
    # Slight brightness variation (±3%)
    brightness = ImageEnhance.Brightness(img)
    img = brightness.enhance(random.uniform(0.97, 1.03))

    # Slight contrast nudge (±4%)
    contrast = ImageEnhance.Contrast(img)
    img = contrast.enhance(random.uniform(0.96, 1.04))

    # Tiny saturation tweak (±5%)
    color = ImageEnhance.Color(img)
    img = color.enhance(random.uniform(0.95, 1.05))

    # Micro-sharpness (simulates phone processing)
    img = img.filter(ImageFilter.UnsharpMask(radius=0.5, percent=8, threshold=2))

    return img


def clean_image(input_path, output_path=None):
    input_path = Path(input_path)

    if output_path is None:
        output_path = input_path.parent / f"{input_path.stem}_clean{input_path.suffix}"
    output_path = Path(output_path)
    jpg_path = output_path.with_suffix(".jpg")

    print(f"🧹 Cleaning: {input_path.name}")

    # Open image — PIL strips metadata on re-save automatically
    img = Image.open(input_path).convert("RGB")

    print(f"  ✓ Metadata stripped")

    # Add grain
    img = add_grain(img, intensity=random.uniform(4, 10))
    print(f"  ✓ Film grain added")

    # Humanize
    img = humanize(img)
    print(f"  ✓ Micro-adjustments applied")

    # Save clean PNG (no metadata)
    img.save(str(output_path), "PNG", optimize=True)
    print(f"  ✓ Saved PNG: {output_path.name}")

    # Save social-ready JPEG (phone-like compression)
    img.save(str(jpg_path), "JPEG", quality=random.randint(82, 91), optimize=True)
    print(f"  ✓ Saved JPEG: {jpg_path.name}")

    print(f"  🌿 Done!\n")
    return str(jpg_path)


def main():
    parser = argparse.ArgumentParser(description="Strip AI metadata + humanize images")
    parser.add_argument("images", nargs="+", help="Image file(s) to clean")
    parser.add_argument("--out", help="Output path (single file only)", default=None)
    args = parser.parse_args()

    for img_path in args.images:
        if not os.path.exists(img_path):
            print(f"⚠️  Not found: {img_path}")
            continue
        clean_image(img_path, args.out if len(args.images) == 1 else None)

    print("✅ All images cleaned and ready to post.")


if __name__ == "__main__":
    main()
