#!/usr/bin/env python3
"""Runs the ad-library cohort through every reachable route via the treg CLI, one raw record per call.
Usage: scripts/run-ads-cohort.py evidence/fixtures/ads-cohort-v1.json evidence/ads-runs/YYYY-MM-DD
About $2 at 2026-09-15 list prices (Apify routes bill per result and dominate)."""
import json, sys, os, subprocess, time, concurrent.futures as cf
from urllib.parse import quote
cohort = json.load(open(sys.argv[1])); out = sys.argv[2]; os.makedirs(out, exist_ok=True)
def call(label, argv, meta):
    f = os.path.join(out, label + '.json')
    if os.path.exists(f): return
    t0 = time.time(); p = subprocess.run(['treg', 'call', *argv], capture_output=True, text=True); ms = int((time.time() - t0) * 1000)
    raw = p.stdout if p.stdout.strip() else p.stderr
    try: body = json.loads(raw)
    except Exception: body = {'_nonjson': raw[:2000]}
    json.dump({'_run': {**meta, 'label': label, 'latency_ms': ms, 'exit': p.returncode, 'ts': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())}, 'response': body}, open(f, 'w'))
    print(label, ms, 'ms exit', p.returncode, flush=True)
jobs = []
for a in cohort['advertisers']:
    k, n, d = a['id'], a['name'], a['domain']
    meta_search_url = f"https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=US&q={quote(n)}&search_type=keyword_unordered"
    jobs += [
      (f'meta-sc_company-{k}', ['scrapecreators.x.v1-facebook-adlibrary-company-ads', '--query', f'companyName={n}', '--query', 'trim=true'], {'platform': 'meta', 'provider': 'sc_company', 'adv': n}),
      (f'meta-sc_search-{k}', ['scrapecreators.x.v1-facebook-adlibrary-search-ads', '--query', f'query={n}', '--query', 'country=US', '--query', 'trim=true'], {'platform': 'meta', 'provider': 'sc_search', 'adv': n}),
      (f'meta-apify-{k}', ['apify.meta-ads.library.search', '--method', 'POST', '--query', 'maxItems=20', '--query', 'timeout=150', '--data', json.dumps({'startUrls': [{'url': meta_search_url}], 'activeStatus': 'active'})], {'platform': 'meta', 'provider': 'apify', 'adv': n}),
      (f'google-sc_advertisers-{k}', ['scrapecreators.x.v1-google-adlibrary-advertisers-search', '--query', f'query={n}'], {'platform': 'google', 'provider': 'sc_advertisers', 'adv': n}),
      (f'google-sc_ads-{k}', ['scrapecreators.x.v1-google-company-ads', '--query', f'domain={d}'], {'platform': 'google', 'provider': 'sc_ads', 'adv': n}),
      (f'google-serpapi-{k}', ['serpapi.google.ads.transparency', '--query', 'engine=google_ads_transparency_center', '--query', f'text={d}', '--query', 'num=40'], {'platform': 'google', 'provider': 'serpapi', 'adv': n}),
      (f'tiktok-sc-{k}', ['scrapecreators.x.v1-tiktok-ad-library-search', '--query', f'query={n}'], {'platform': 'tiktok', 'provider': 'sc', 'adv': n}),
      (f'tiktok-apify-{k}', ['apify.tiktok-ads.library.search', '--method', 'POST', '--query', 'maxItems=20', '--query', 'timeout=150', '--data', json.dumps({'search': n, 'query_type': '1', 'region': 'all', 'limit': 20})], {'platform': 'tiktok', 'provider': 'apify', 'adv': n}),
      (f'tiktok-tikhub-{k}', ['tikhub.x.tiktok-ads-search-ads', '--method', 'POST', '--data', json.dumps({'keyword': n})], {'platform': 'tiktok', 'provider': 'tikhub', 'adv': n}),
      (f'linkedin-sc-{k}', ['scrapecreators.x.v1-linkedin-ads-search', '--query', f'company={n}'], {'platform': 'linkedin', 'provider': 'sc', 'adv': n}),
    ]
by = {}
for j in jobs: by.setdefault(j[2]['platform'] + '/' + j[2]['provider'], []).append(j)
with cf.ThreadPoolExecutor(max_workers=len(by)) as ex:
    list(ex.map(lambda lst: [call(*j) for j in lst], by.values()))
print('done', len(jobs))
