"""
batch_generate.py

Runs place_logo's zone-placement logic across an entire mockup library for
one client in a single pass, and builds an HTML contact sheet so you can
review every generated application at once instead of opening files one by one.

Expected library layout (flat or nested, doesn't matter):
    mockups/
      packaging/
        spray-bottle-01.png
        spray-bottle-01.json
      uniform/
        polo-front.png
        polo-front.json
      vehicle/
        van-side.png
        van-side.json
      ...

Each mockup needs a same-named .json zone file sitting next to its image
(exactly what the zone-definition tool exports).

Usage:
    python batch_generate.py \
        --mockups-dir mockups \
        --logo-full clients/acme/logo-full.png \
        --logo-mark clients/acme/logo-mark.png \
        --client acme \
        --out-dir output \
        --industry cleaning \
        --type packaging,uniform,vehicle
"""

import argparse
import json
import os
from pathlib import Path

from place_logo import place_zones

IMAGE_EXTS = [".png", ".jpg", ".jpeg", ".webp"]


def find_mockups(mockups_dir):
    """Pair up every zone JSON with its matching image file."""
    pairs = []
    for json_path in Path(mockups_dir).rglob("*.json"):
        stem = json_path.stem
        image_path = None
        for ext in IMAGE_EXTS:
            candidate = json_path.with_name(stem + ext)
            if candidate.exists():
                image_path = candidate
                break
        if image_path is None:
            print(f"Skipping {json_path.name}: no matching image file found")
            continue
        pairs.append((image_path, json_path))
    return pairs


def spec_matches_filters(spec, industry_filter, type_filter):
    if type_filter and spec.get("type") not in type_filter:
        return False
    if industry_filter:
        tags = set(spec.get("industry_tags", []))
        if "general" in tags:
            return True  # universal tier: always included regardless of industry filter
        if not tags.intersection(industry_filter):
            return False
    return True


def build_contact_sheet(results, client, out_dir):
    rows = []
    for r in results:
        rows.append(f"""
        <div class="card">
          <img src="{r['relpath']}" alt="{r['mockup_id']}">
          <div class="label">
            <span class="id">{r['mockup_id']}</span>
            <span class="type">{r['type']}</span>
          </div>
        </div>""")

    html = f"""<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>{client} — generated mockups</title>
<style>
  body {{ font-family: sans-serif; background:#F2F1EC; margin:0; padding:32px; }}
  h1 {{ font-size:20px; margin:0 0 24px; }}
  .grid {{ display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:20px; }}
  .card {{ background:#fff; border:1px solid #D9D6CA; border-radius:8px; overflow:hidden; }}
  .card img {{ width:100%; display:block; background:#eee; }}
  .label {{ padding:10px 12px; display:flex; justify-content:space-between; font-size:12px; }}
  .id {{ font-weight:600; }}
  .type {{ color:#6B6D65; text-transform:uppercase; letter-spacing:0.04em; }}
</style></head>
<body>
  <h1>{client} — {len(results)} generated mockups</h1>
  <div class="grid">{"".join(rows)}</div>
</body></html>"""

    index_path = Path(out_dir) / client / "index.html"
    index_path.write_text(html)
    return index_path


def run_batch(mockups_dir, logo_full, logo_mark, client, out_dir, industry_filter, type_filter):
    pairs = find_mockups(mockups_dir)
    client_out = Path(out_dir) / client
    client_out.mkdir(parents=True, exist_ok=True)

    results = []
    skipped = 0

    for image_path, json_path in pairs:
        spec = json.loads(json_path.read_text())
        if not spec_matches_filters(spec, industry_filter, type_filter):
            skipped += 1
            continue

        mockup_id = spec.get("mockup_id", json_path.stem)
        out_name = f"{mockup_id}.png"
        out_path = client_out / out_name

        place_zones(str(image_path), str(json_path), logo_full, logo_mark, str(out_path))

        results.append({
            "mockup_id": mockup_id,
            "type": spec.get("type", "unknown"),
            "relpath": out_name,
        })

    print(f"\nGenerated {len(results)} mockup(s), skipped {skipped} (filtered out).")

    if results:
        manifest_path = client_out / "manifest.json"
        manifest_path.write_text(json.dumps(results, indent=2))
        print(f"Manifest: {manifest_path}")

        index_path = build_contact_sheet(results, client, out_dir)
        print(f"Contact sheet: {index_path}")
    else:
        print("Nothing matched your filters — check --industry / --type against your library's tags.")

    return results


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Batch-generate a client's full mockup set.")
    parser.add_argument("--mockups-dir", required=True, help="Root folder of your mockup library")
    parser.add_argument("--logo-full", help="Path to full logo lockup (PNG, transparent bg)")
    parser.add_argument("--logo-mark", help="Path to standalone mark/icon (PNG, transparent bg)")
    parser.add_argument("--client", required=True, help="Client name, used as output subfolder")
    parser.add_argument("--out-dir", default="output", help="Root output folder")
    parser.add_argument("--industry", help="Comma-separated industry tags to filter by (optional)")
    parser.add_argument("--type", help="Comma-separated mockup types to filter by (optional)")
    args = parser.parse_args()

    industry_filter = set(args.industry.split(",")) if args.industry else None
    type_filter = set(args.type.split(",")) if args.type else None

    run_batch(
        args.mockups_dir,
        args.logo_full,
        args.logo_mark,
        args.client,
        args.out_dir,
        industry_filter,
        type_filter,
    )
