#!/usr/bin/env python3
"""Who uses which asset, both ways.  asset-usage --uses <asset-id>   -> every app/game using it
                                     asset-usage --used-by <slug>    -> every asset that app/game uses (slug or platform:slug)
Reads usage/by_asset.json and usage/by_app.json (built by tools/usage_index.py). --json for machine output; --bulk shows engine-kit copies."""
import json, os, sys

ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


def load(name, root=ROOT):
    p = os.path.join(root, 'usage', name)
    return json.load(open(p)) if os.path.exists(p) else {}


def uses(asset_id, root=ROOT, bulk=False):
    """Asset id (or unique prefix) -> list of user rows."""
    ba = load('by_asset.json', root)
    ids = [asset_id] if asset_id in ba else [i for i in ba if i.startswith(asset_id)]
    return [dict(r, asset_id=i) for i in ids for r in ba[i]['users'] if bulk or not r.get('bulk')]


def used_by(slug, root=ROOT):
    """App/game slug (optionally 'omg:slug') -> list of asset rows."""
    bp = load('by_app.json', root)
    keys = [k for k in bp if k == slug or k.split(':', 1)[1] == slug]
    return [dict(r, user=k) for k in keys for r in bp[k]['assets']]


def main(argv):
    root = os.environ.get('FORGE_ASSET_LIBRARY', ROOT)
    js, bulk = '--json' in argv, '--bulk' in argv
    args = [a for a in argv if not a.startswith('--')]
    if '--uses' in argv:
        rows = uses(argv[argv.index('--uses') + 1], root, bulk)
        out = rows if js else [f"{r['platform']}:{r['user']}  {r['asset_id']} v{','.join(map(str, r['versions']))}  first {r['first_seen'][:10]}  [{','.join(r['sources'])}]" for r in rows]
    elif '--used-by' in argv:
        rows = used_by(argv[argv.index('--used-by') + 1], root)
        out = rows if js else [f"{r['asset_id']} v{','.join(map(str, r['versions']))}  first {r['first_seen'][:10]}  [{','.join(r['sources'])}]" for r in rows]
    else:
        print(__doc__); return 2
    print(json.dumps(out, indent=1) if js else ('\n'.join(out) or 'nothing recorded'))
    return 0


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
