import json, os, sys, tempfile
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(ROOT, 'tools')); sys.path.insert(0, ROOT)
import usage_index as ui  # noqa: E402
import asset_usage  # noqa: E402

E = lambda a, u, ts='2026-10-01T00:00:00Z', p='omg', v=1, s='build_pack': dict(ts=ts, asset_id=a, version=v, release='sha256:' + a, user=u, platform=p, source=s)


def test_fold_dedupes_and_goes_both_ways():
    ev = [E('a/x', 'g1'), E('a/x', 'g1', ts='2026-10-03T00:00:00Z', v=2, s='db'), E('a/x', 'g2'), E('b/y', 'g1', p='hand')]
    ba, bp = ui.fold(ev)
    assert ba['a/x']['count'] == 2
    r = [u for u in ba['a/x']['users'] if u['user'] == 'g1'][0]
    assert r['events'] == 2 and r['versions'] == [1, 2] and r['first_seen'].startswith('2026-10-01') and r['last_seen'].startswith('2026-10-03')
    assert r['sources'] == ['build_pack', 'db']
    assert bp['omg:g1']['count'] == 1 and bp['hand:g1']['count'] == 1  # same slug on two platforms stays apart
    assert [a['asset_id'] for a in bp['omg:g1']['assets']] == ['a/x']


def test_bulk_users_listed_but_not_counted():
    ba, bp = ui.fold([E('a/x', 'g1'), E('a/x', 'kit', p='hand')], bulk={'hand:kit'})
    assert ba['a/x']['count'] == 1 and len(ba['a/x']['users']) == 2 and bp['hand:kit']['bulk']


def test_read_events_skips_junk():
    with tempfile.TemporaryDirectory() as d:
        os.makedirs(d + '/live')
        open(d + '/live/x.jsonl', 'w').write(json.dumps(E('a/x', 'g')) + '\nnot json\n' + json.dumps(dict(E('a/x', 'g'), platform='zzz')) + '\n\n')
        assert len(ui.read_events(d)) == 1


def test_build_and_queries():
    with tempfile.TemporaryDirectory() as d:
        os.makedirs(d + '/usage/live')
        open(d + '/usage/live/a.jsonl', 'w').write(''.join(json.dumps(e) + '\n' for e in [E('a/x', 'g1'), E('a/x', 'g1'), E('b/y', 'g2', p='omu')]))
        n, ba, bp = ui.build(d)
        assert n == 3 and set(ba) == {'a/x', 'b/y'}
        assert [r['user'] for r in asset_usage.uses('a/x', d)] == ['g1']
        assert [r['asset_id'] for r in asset_usage.used_by('g2', d)] == ['b/y']
        assert asset_usage.used_by('omu:g2', d) and not asset_usage.used_by('nope', d)


def test_library_usage_record_never_raises():
    from omg.factory import library_usage as lu
    with tempfile.TemporaryDirectory() as d:
        p = __import__('pathlib').Path(d) / 'sub' / 'e.jsonl'
        assert lu.record([{'id': 'a/x', 'version': 1, 'release': 'r'}], 'g1', ledger=p) == 1
        assert json.loads(p.read_text())['user'] == 'g1'
        assert lu.record([{'id': 'a/x'}], '', ledger=p) == 0
        assert lu.record([{'id': 'a/x'}], 'g', ledger=__import__('pathlib').Path('/proc/nope/x')) == 0
