#!/usr/bin/env python3
"""
Download Roblox asset thumbnails once, save as PNG next to the panel for static <img src>.

Uses the same asset IDs as BLACKSCREEN_HUD.lua SKILL_ICONS.

Run:
  python download_roblox_activity_icons.py
  python download_roblox_activity_icons.py --out "C:\\xampp\\htdocs\\BS\\activity_icons"

Python 3.7+ — stdlib only (no pip).
"""

from __future__ import annotations

import argparse
import json
import ssl
import sys
import urllib.error
import urllib.request
from pathlib import Path
from typing import Optional

# Filename stem -> Roblox asset ID (PNG written as <stem>.png)
ASSET_IDS: dict[str, int] = {
    "janitor": 135184226521959,
    "cook": 129264619893382,
    "shelf_stocker": 134812486114734,
    "stamina": 92120615566345,
    "total_level": 102674664582760,
    "atm_hacker": 74076710555685,
    "farmer": 117400976699935,
    "fishing": 106570831786716,
}

USER_AGENT = "Mozilla/5.0 (compatible; BS-Panel/1.0)"


def _ctx(insecure: bool) -> Optional[ssl.SSLContext]:
    if not insecure:
        return None
    c = ssl.create_default_context()
    c.check_hostname = False
    c.verify_mode = ssl.CERT_NONE
    return c


def _download_png_for_asset(asset_id: int, insecure: bool) -> bytes:
    ctx = _ctx(insecure)
    api = (
        f"https://thumbnails.roblox.com/v1/assets"
        f"?assetIds={asset_id}&size=150x150&format=Png"
    )
    req = urllib.request.Request(api, headers={"User-Agent": USER_AGENT, "Accept": "application/json"})
    with urllib.request.urlopen(req, timeout=30, context=ctx) as r:
        data = json.loads(r.read().decode("utf-8"))
    url = data["data"][0]["imageUrl"]
    req2 = urllib.request.Request(url, headers={"User-Agent": USER_AGENT, "Accept": "image/*,*/*"})
    with urllib.request.urlopen(req2, timeout=45, context=ctx) as r:
        return r.read()


def download_asset_png(asset_id: int) -> bytes:
    try:
        return _download_png_for_asset(asset_id, insecure=False)
    except ssl.SSLError:
        return _download_png_for_asset(asset_id, insecure=True)


def main() -> int:
    ap = argparse.ArgumentParser()
    ap.add_argument(
        "--out",
        type=Path,
        default=Path(__file__).resolve().parent.parent / "activity_icons",
        help="Output folder (default: BS/activity_icons)",
    )
    args = ap.parse_args()
    out: Path = args.out
    out.mkdir(parents=True, exist_ok=True)

    failed = 0
    for name, aid in ASSET_IDS.items():
        path = out / f"{name}.png"
        try:
            raw = download_asset_png(aid)
        except (urllib.error.URLError, ssl.SSLError, OSError, KeyError, IndexError, RuntimeError) as e:
            print(f"[FAIL] {name} id={aid}: {e}", file=sys.stderr)
            failed += 1
            continue
        path.write_bytes(raw)
        print(f"[OK] {path} ({len(raw)} bytes)")

    n = len(ASSET_IDS) - failed
    print(f"Done: {n}/{len(ASSET_IDS)} -> {out}")
    return 0 if failed == 0 else 1


if __name__ == "__main__":
    sys.exit(main())
