#!/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 packages.pet_package_schema import load_pet_package
from services.ai.qwen_client import QwenConfigError, QwenRequestError, QwenReviewClient


def main() -> int:
    parser = argparse.ArgumentParser(description="Run a Qwen review over public pet package fixtures.")
    parser.add_argument("--fixture", help="Fixture directory to review.")
    parser.add_argument("--all-public", action="store_true", help="Review every public fixture.")
    parser.add_argument("--env", default=str(ROOT / ".env.local"), help="Local env file. Values are never printed.")
    args = parser.parse_args()

    if not args.fixture and not args.all_public:
        parser.error("Use --fixture or --all-public")

    fixture_dirs = []
    if args.all_public:
        fixture_dirs = sorted((ROOT / "tests" / "fixtures" / "public").iterdir())
    else:
        fixture_dirs = [Path(args.fixture)]

    try:
        client = QwenReviewClient.from_env(args.env)
        results = [review_fixture(client, fixture_dir) for fixture_dir in fixture_dirs if fixture_dir.is_dir()]
    except (QwenConfigError, QwenRequestError, ValueError) as exc:
        print(json.dumps({"status": "failed", "reason": str(exc)}, ensure_ascii=False, indent=2))
        return 1

    print(json.dumps({"status": "ok", "results": results}, ensure_ascii=False, indent=2))
    return 0


def review_fixture(client: QwenReviewClient, fixture_dir: Path) -> dict[str, object]:
    package = load_pet_package(fixture_dir)
    spritesheet = fixture_dir / package["asset"]["spritesheetPath"]
    result = client.review_pet_package(
        pet_name=package["displayName"],
        description=package["description"],
        image_bytes=spritesheet.read_bytes(),
        image_mime=package["asset"]["mimeType"],
    )
    return {
        "fixtureId": package["id"],
        "provider": result["provider"],
        "model": result["model"],
        "response_id": result.get("response_id"),
        "review": result["review"],
    }


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