#!/usr/bin/env python3
"""
Visual Capture Script — visual-competitive-analysis skill
Captures screenshots from brand homepages, Instagram grids, TikTok grids.

Usage:
  python3 capture.py --brand cashapp --homepage https://cash.app
  python3 capture.py --brand cashapp --instagram cashapp
  python3 capture.py --brand cashapp --tiktok cashapp
  python3 capture.py --brand cashapp --url https://any-url.com --label homepage
  python3 capture.py --brand cashapp --all  (runs homepage + ig + tiktok if configured)
"""

import argparse
import subprocess
import sys
import os
import json
from pathlib import Path

SCRIPT_DIR = Path(__file__).parent
WORKSPACE = SCRIPT_DIR.parent.parent.parent
PUBLIC = WORKSPACE / "public"

def screenshot_url(url: str, output_path: str, width: int = 1400, full_page: bool = True, wait_ms: int = 2000) -> bool:
    """Take a screenshot using Playwright."""
    script = f"""
const {{ chromium }} = require('playwright');
(async () => {{
  const browser = await chromium.launch({{ headless: true }});
  const context = await browser.newContext({{
    viewport: {{ width: {width}, height: 900 }},
    userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
  }});
  const page = await context.newPage();
  try {{
    await page.goto('{url}', {{ waitUntil: 'networkidle', timeout: 30000 }});
    await page.waitForTimeout({wait_ms});
    // Dismiss cookie banners/popups if present
    const dismissSelectors = ['[aria-label="Close"]', '.cookie-banner button', '#onetrust-accept-btn-handler', '[data-testid="close-button"]'];
    for (const sel of dismissSelectors) {{
      try {{ await page.click(sel, {{ timeout: 1000 }}); }} catch {{}}
    }}
    await page.screenshot({{ path: '{output_path}', fullPage: {str(full_page).lower()} }});
    console.log('OK: ' + '{output_path}');
  }} catch (e) {{
    console.error('ERROR: ' + e.message);
    process.exit(1);
  }} finally {{
    await browser.close();
  }}
}})();
"""
    tmp = "/tmp/capture_pw.js"
    with open(tmp, "w") as f:
        f.write(script)
    result = subprocess.run(["node", tmp], capture_output=True, text=True, timeout=60)
    if result.returncode != 0:
        print(f"  ✗ {result.stderr.strip()}", file=sys.stderr)
        return False
    print(f"  ✓ {output_path}")
    return True


def capture_homepage(brand: str, url: str, out_dir: Path) -> str:
    out = str(out_dir / f"{brand}-homepage.jpg")
    # Convert to jpg after screenshot
    png = out.replace(".jpg", ".png")
    ok = screenshot_url(url, png, width=1400, full_page=False, wait_ms=3000)
    if ok and os.path.exists(png):
        subprocess.run(["convert", png, "-quality", "85", out], capture_output=True)
        os.remove(png)
    return out if os.path.exists(out) else png


def capture_instagram(brand: str, username: str, out_dir: Path) -> str:
    """Screenshot Instagram profile grid."""
    url = f"https://www.instagram.com/{username}/"
    out = str(out_dir / f"{brand}-instagram-grid.png")
    # Instagram needs a viewport that shows the grid
    ok = screenshot_url(url, out, width=1200, full_page=False, wait_ms=4000)
    return out if ok else None


def capture_tiktok(brand: str, username: str, out_dir: Path) -> str:
    """Screenshot TikTok profile grid."""
    url = f"https://www.tiktok.com/@{username}"
    out = str(out_dir / f"{brand}-tiktok-grid.png")
    ok = screenshot_url(url, out, width=1200, full_page=False, wait_ms=4000)
    return out if ok else None


def capture_url(brand: str, url: str, label: str, out_dir: Path) -> str:
    """Screenshot any URL."""
    safe_label = label.replace(" ", "-").lower()
    out = str(out_dir / f"{brand}-{safe_label}.png")
    ok = screenshot_url(url, out, width=1400, full_page=True, wait_ms=2000)
    return out if ok else None


def main():
    parser = argparse.ArgumentParser(description="Visual capture for competitor research")
    parser.add_argument("--brand", required=True, help="Brand slug (e.g. cashapp)")
    parser.add_argument("--homepage", help="Homepage URL")
    parser.add_argument("--instagram", help="Instagram username")
    parser.add_argument("--tiktok", help="TikTok username")
    parser.add_argument("--url", help="Any URL to screenshot")
    parser.add_argument("--label", default="custom", help="Label for --url output filename")
    parser.add_argument("--out-dir", help="Output directory (default: public/etoro-competition/{brand}/assets/)")
    args = parser.parse_args()

    # Set output dir
    if args.out_dir:
        out_dir = Path(args.out_dir)
    else:
        out_dir = PUBLIC / "etoro-competition" / f"{args.brand}-live" / "assets"
    out_dir.mkdir(parents=True, exist_ok=True)
    print(f"Output dir: {out_dir}")

    results = {}

    if args.homepage:
        print(f"\n→ Homepage: {args.homepage}")
        path = capture_homepage(args.brand, args.homepage, out_dir)
        results["homepage"] = path

    if args.instagram:
        print(f"\n→ Instagram: @{args.instagram}")
        path = capture_instagram(args.brand, args.instagram, out_dir)
        results["instagram"] = path

    if args.tiktok:
        print(f"\n→ TikTok: @{args.tiktok}")
        path = capture_tiktok(args.brand, args.tiktok, out_dir)
        results["tiktok"] = path

    if args.url:
        print(f"\n→ URL: {args.url}")
        path = capture_url(args.brand, args.url, args.label, out_dir)
        results["custom"] = path

    print("\n--- Results ---")
    for k, v in results.items():
        status = "✓" if v and os.path.exists(v) else "✗"
        print(f"  {status} {k}: {v}")

    print(json.dumps(results))


if __name__ == "__main__":
    main()
