#!/usr/bin/env python3
"""python3 score.py raw/<file>.jsonl : brand mention / first-mention / own-site citation counts -> results.csv"""
import csv, json, re, sys, urllib.parse, collections
# brand: (regex over answer text, own domains)
B = {
 'Jinpeng (金彭)': (r'Jinpeng|金彭', ['jinpeng-global.com', 'jpjinpeng.com', 'jpddc.com', 'jinpenggroup.en.made-in-china.com']),
 'Huaihai (淮海)': (r'Huaihai|淮海', ['huaihaiglobal.com']),
 'Zongshen / Zonsen (宗申)': (r'Zongshen|Zonsen|宗申', ['zonsen.cn', 'zonsenmotor.com']),
 'Wuzheng (五征)': (r'Wuzheng|五征', ['wuzheng.com', 'chinawuzheng.en.made-in-china.com']),
 'Wuxing (五星)': (r'Wuxing|五星', ['wuxingcl.cn']),
 'Xinge (新鸽)': (r'Xinge|新鸽', ['xinge-motorcycle.com']),
 'Dayang (大阳)': (r'Dayang|大阳', ['dayangmoto.com', 'dayangmotor.com', 'dayangsanlun.cn']),
 'Loncin (隆鑫)': (r'Loncin|隆鑫', ['loncinindustries.com']),
 'Zonlon': (r'Zonlon', ['zonlonmotor.com']),
 'Sonlink': (r'Sonlink', ['sonlinkmotor.com', 'sonlink.ke']),
 'Shifeng (时风)': (r'Shifeng|时风', ['shifengvehicle.com']),
 'Chongqing Beiyi': (r'Beiyi|BEYEE', ['beyeemoto.com']),
 'Guoning': (r'Guoning', ['guoningcy.com']),
 'Yaolon': (r'Yaolon', ['yaolontricycle.com']),
 'Ouwang': (r'Ouwang', ['ouwangtricycle.com']),
 'Dishen': (r'Dishen', ['dishentech.com']),
 'Jinwanfu': (r'Jinwanfu|JINWANFU', ['jinwanfuev.com']),
 'Yadea (雅迪)': (r'Yadea|雅迪', ['yadea.com']),
 'Lifan (力帆)': (r'Lifan|力帆', []),
 'LinkZoom': (r'LinkZoom|Linkzoom', ['linkzoomev.com']),
 'Uzen': (r'\bUzen\b', ['uzenev.com']),
 'STARGO': (r'STARGO|Star Go', ['stargomoto.com']),
 'Kainiu': (r'Kainiu', ['kainiu.en.made-in-china.com']),
 'Chongqing Wanhong': (r'Wanhong', ['cqwanhong.en.made-in-china.com']),
 'Kevla': (r'Kevla', ['kevla-motor.com']),
 'Gudao Andes': (r'Andes Machinery|Gudao', ['gdandesmachinery.en.made-in-china.com']),
 'Changli (长力)': (r'Changli|长力', ['changlitruck.com']),
 'QAY New Energy': (r'\bQAY\b', ['qaynewenergy.com']),
 'JJ Global': (r'JJ GLOBAL|JJ Global', ['jj-ev.com']),
 'Sanili': (r'Sanili', ['sanilimotor.com']),
 'Haibao (海宝)': (r'Haibao|海宝', ['haibaoev.com']),
 'Jiuxin (Yuejiujiu)': (r'Yuejiujiu|Jiuxin', ['yuejiujiutricycle.com']),
 'Haojin (豪进)': (r'Haojin|豪进', []),
 'Dayun (大运)': (r'Dayun|大运', ['dayun.cc']),
 'Huasha': (r'Huasha', []),
 'China Topway': (r'Topway', []),
 'Foton (福田)': (r'\bFoton\b', []),
 'Zhizhe EV (智者)': (r'Zhizhe|智者新能源', ['zz-ev.com']),
 'ZXTEC': (r'ZXTEC', ['zxtecglobal.com']),
 'Urit': (r'\bUrit\b', ['chinaurit.com']),
 'NVP': (r'\bNVP\b', ['nvp-moto.com']),
 'Dongben': (r'Dongben', ['cndongben.en.made-in-china.com']),
 'Chenglang': (r'Chenglang', ['cnchenglang.com']),
 'Jolmolangma': (r'Jolmolangma', ['jolmolangma.com']),
 'Langfang Sandi': (r'\bSandi\b', ['sanditricycle.com']),
}
L = [json.loads(l) for l in open(sys.argv[1])]
n = len(L); rows = collections.defaultdict(lambda: {'mention': 0, 'first': 0, 'cited': 0, 'ids': []})
for d in L:
    a = d['answer']; first = None
    doms = {urllib.parse.urlsplit(u).netloc.replace('www.', '') for u in d['links'] or []}
    for b, (rx, ds) in B.items():
        m = re.search(rx, a, re.I if b not in ('STARGO', 'QAY New Energy', 'JJ Global') else 0)
        if m:
            rows[b]['mention'] += 1; rows[b]['ids'].append(d['id'])
            if first is None or m.start() < first[1]: first = (b, m.start())
        if any(h == x or h.endswith('.' + x) for h in doms for x in ds): rows[b]['cited'] += 1
    if first: rows[first[0]]['first'] += 1
out = sorted(rows.items(), key=lambda x: (-x[1]['mention'], -x[1]['first']))
with open('results.csv', 'w', newline='') as f:
    w = csv.writer(f); w.writerow(['rank', 'brand', 'mentioned_in', 'mention_rate', 'first_mentioned_in', 'first_rate', 'own_site_cited_in', 'prompt_ids'])
    for i, (b, r) in enumerate(out, 1):
        w.writerow([i, b, r['mention'], f"{r['mention']/n:.0%}", r['first'], f"{r['first']/n:.0%}", r['cited'], ' '.join(r['ids'])])
        print(f"{i:>2} {b:42} {r['mention']:>2}/{n} {r['mention']/n:>4.0%}  first {r['first']:>2}  cited {r['cited']:>2}")
