#!/usr/bin/env python3
"""Read-only FramePack inventory, not an installer or inference readiness test.

No network calls, model downloads, package imports or generation requests.
Optional nvidia-smi query reads the existing local driver utility only.
"""

import argparse
import importlib.metadata
import json
import platform
import shutil
import subprocess
from pathlib import Path


def inventory_repo(root):
    result = {}
    for name in ["demo_gradio.py", "demo_gradio_f1.py", "requirements.txt"]:
        file = root / name
        try:
            size = file.stat().st_size if file.is_file() else 0
            result[name] = {"nonempty_file": size > 0, "bytes": size}
        except OSError:
            result[name] = {"nonempty_file": False, "error": "unreadable"}
    result["diffusers_helper"] = {"directory_present": (root / "diffusers_helper").is_dir()}
    return result


def gpu_inventory(skip=False):
    if skip:
        return {"status": "not_queried"}
    executable = shutil.which("nvidia-smi")
    if not executable:
        return {"status": "utility_unavailable"}
    try:
        query = subprocess.run(
            [
                executable,
                "--query-gpu=name,memory.total,memory.free",
                "--format=csv,noheader,nounits",
            ],
            capture_output=True,
            text=True,
            timeout=5,
            check=False,
        )
        if query.returncode != 0:
            return {"status": "query_failed", "exit_code": query.returncode}
        devices = []
        for line in query.stdout.splitlines():
            fields = [value.strip() for value in line.rsplit(",", 2)]
            if len(fields) != 3:
                continue
            try:
                total, free = int(fields[1]), int(fields[2])
            except ValueError:
                continue
            if total > 0 and 0 <= free <= total:
                devices.append({"name": fields[0], "total_mib": total, "free_mib": free})
        return {"status": "reported" if devices else "unrecognized_output", "devices": devices}
    except (OSError, subprocess.TimeoutExpired):
        return {"status": "query_unavailable"}


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--repo", type=Path, required=True)
    parser.add_argument("--skip-gpu-query", action="store_true")
    args = parser.parse_args()
    packages = {}
    for name in ["torch", "gradio", "diffusers", "transformers"]:
        try:
            packages[name] = importlib.metadata.version(name)
        except importlib.metadata.PackageNotFoundError:
            packages[name] = None
    result = {
        "scope": "inventory_only",
        "os": platform.system(),
        "python_version": platform.python_version(),
        "upstream_os_listed": platform.system() in {"Linux", "Windows"},
        "repo_files": inventory_repo(args.repo),
        "package_metadata": packages,
        "gpu": gpu_inventory(args.skip_gpu_query),
        "not_verified": [
            "repository authenticity or revision",
            "model files and hashes",
            "CUDA and package compatibility",
            "available memory at generation time",
            "successful inference, speed or offline operation",
        ],
    }
    print(json.dumps(result, indent=2))


if __name__ == "__main__":
    main()
