#!/usr/bin/env python3
from __future__ import annotations

import argparse
import json
import sys
from pathlib import Path


ROOT = Path(__file__).resolve().parents[1]
if str(ROOT) not in sys.path:
    sys.path.insert(0, str(ROOT))

from services.ai.qwen_client import QwenConfigError, QwenRequestError, QwenReviewClient


def _guess_mime_type(path: Path) -> str:
    suffix = path.suffix.lower()
    if suffix == ".webp":
        return "image/webp"
    if suffix == ".png":
        return "image/png"
    if suffix in {".jpg", ".jpeg"}:
        return "image/jpeg"
    return "application/octet-stream"


def main() -> int:
    parser = argparse.ArgumentParser(description="Run Qwen review for one generated PetBuild package.")
    parser.add_argument("--build-dir", required=True)
    parser.add_argument("--env", default=str(ROOT / ".env.local"))
    parser.add_argument("--out", default=None, help="Optional JSON report path. Defaults to outputs/test_reports.")
    args = parser.parse_args()

    build_dir = Path(args.build_dir)
    try:
        manifest = json.loads((build_dir / "manifest.json").read_text(encoding="utf-8"))
        spritesheet = build_dir / manifest["spritesheet_path"]
        client = QwenReviewClient.from_env(args.env)
        result = client.review_pet_package(
            pet_name=manifest["display_name"],
            description=manifest["source"].get("analysis_summary", "Generated P0 high-fidelity desktop pet package."),
            image_bytes=spritesheet.read_bytes(),
            image_mime=_guess_mime_type(spritesheet),
        )
    except (QwenConfigError, QwenRequestError, KeyError, OSError, json.JSONDecodeError) as exc:
        print(json.dumps({"status": "failed", "reason": str(exc)}, ensure_ascii=False, indent=2))
        return 1

    payload = {
        "status": "ok",
        "build_id": manifest["build_id"],
        "package_id": manifest["package_id"],
        "provider": result["provider"],
        "model": result["model"],
        "response_id": result.get("response_id"),
        "review": result["review"],
    }
    out_path = Path(args.out) if args.out else ROOT / "outputs" / "test_reports" / f"qwen_review_build_{manifest['build_id']}.json"
    out_path.parent.mkdir(parents=True, exist_ok=True)
    out_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    try:
        report_path = str(out_path.relative_to(ROOT))
    except ValueError:
        report_path = str(out_path)
    print(json.dumps(payload | {"report": report_path}, ensure_ascii=False, indent=2))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
