#!/usr/bin/env python3
"""python3 score.py raw/<file>.jsonl [more.jsonl ...] : brand mention / first-mention / own-site citation counts -> results.csv
Only brands verified as Chinese companies are scored. US brands sold on Chinese-built carts (ICON, Denago, Evolution, Bintelli, Atlas)
and foreign makers (Club Car, E-Z-GO, Yamaha, Stellantis) are not scored. Model names count toward their maker (Hongguang MINI EV -> Wuling,
Panda -> Geely, Lumin -> Changan, T03 -> Leapmotor, Seagull/Dolphin -> BYD); "Xingyuan" is a Geely model and counts as Geely."""
import csv, json, re, sys, urllib.parse, collections
CS = {'GAC', 'BYD', 'JAC', 'HDK', 'DAOD', 'CENGO', 'EDACAR', 'BAW'}  # case-sensitive (common words otherwise)
# brand: (regex over answer text, own domains)
B = {
 # passenger-car makers with mini / low-speed EVs
 'SAIC-GM-Wuling': (r'\bWuling\b|\bSGMW\b|\bBaojun\b|Hongguang', ['wuling.com', 'wulingmotors.com.cn', 'wulingmotor.com', 'wulingvehicles.com', 'sgmw.com.cn']),
 'BYD': (r'\bBYD\b|\bSeagull\b|\bDolphin\b', ['byd.com']),
 'Geely': (r'\bGeely\b|Xingyuan|\bPanda (?:Mini|Knight)', ['geely.com']),
 'Chery': (r'\bChery\b', ['chery.cn', 'cheryinternational.com']),
 'Changan': (r'\bChangan\b|\bLumin\b', ['globalchangan.com', 'changan.com.cn']),
 'Leapmotor': (r'\bLeapmotor\b|\bT03\b', ['leapmotor.com', 'leapmotor-international.com']),
 'Dongfeng': (r'\bDongfeng\b', ['dongfeng-global.com', 'dfmc.com.cn']),
 'Great Wall (ORA)': (r'Great Wall|\bGWM\b', ['gwm-global.com', 'gwm.com.cn']),
 'JAC': (r'\bJAC\b', ['jac.com.cn', 'jacen.jac.com.cn']),
 'Kandi': (r'\bKandi\b', ['kandiamerica.com', 'kandigroup.com']),
 'BAW': (r'\bBAW\b', ['baw.com.cn']),
 'GAC Aion': (r'\bGAC\b|\bAion\b', ['gacmotor.com', 'aion.com.cn']),
 'Zhidou': (r'\bZhidou\b', []),
 'Linktour': (r'\bLinktour\b', []),
 'Bontu': (r'\bBontu\b', []),
 'Yadea': (r'\bYadea\b', ['yadea.com', 'yadea.com.cn']),
 # low-speed EV and mini-car makers
 'Levdeo / BYVIN': (r'\bLevdeo\b|\bBYVIN\b', ['levdeo.com', 'byvin.com']),
 'Yogomo': (r'\bYogomo\b', ['yogomo.com']),
 'Lichi': (r'\bLichi\b', ['lichi.com.cn']),
 'Shifeng': (r'\bShifeng\b', ['shifeng.com']),
 'Jinpeng': (r'\bJinpeng\b', ['jinpeng-global.com', 'jinpenggroup.com']),
 'Huaihai': (r'\bHuaihai\b', ['huaihaiglobal.com', 'huaihai.com.cn']),
 'Zongshen': (r'\bZongshen\b', ['zongshen.com', 'zongshenmotor.com']),
 'Fulu': (r'\bFulu\b', ['fulu.com.cn']),
 'Anan EV': (r'\bAnan\b', ['ananelectriccar.com']),
 'Yunlong': (r'\bYunlong\b', ['yunlongmobility.com']),
 'Changli': (r'\bChangli\b', ['changlievs.com']),
 'Hongri': (r'\bHongri\b', ['hongriauto.com']),
 'Jiayuan': (r'\bJiayuan\b', ['jiayuanev.com']),
 'Kaiyun (Pickman)': (r'\bKaiyun\b|\bPickman\b', ['kaiyunmotors.com']),
 'Xiangyuan / Jiajie': (r'Xiangyuan|Jiajie|\bJiaji\b', ['jiajiev.com', 'jiaji-ev.com']),
 'Lvbao': (r'\bLvbao\b', ['lvbaoev.com']),
 'Dachi': (r'\bDachi\b', ['dachivehicle.com']),
 # golf-cart and sightseeing-car makers
 'Marshell': (r'\bMarshell\b', ['marshell.net', 'marshell.en.made-in-china.com']),
 'Lvtong': (r'\bLvtong\b', ['lvtong-golfcart.com', 'lvtong.com.cn', 'lvtongcart.com']),
 'Eagle (Suzhou Eagle)': (r'Suzhou Eagle|\bEagle (?:EV|Electric)', ['eagle-ev.com', 'szeagle.en.alibaba.com']),
 'HDK (Xiamen Dalle)': (r'\bHDK\b|Xiamen Dalle', ['hdkev.com', 'hdkexpress.com']),
 'BorCart': (r'\bBorCart\b', ['borcart.com']),
 'EXCAR': (r'\bEXCAR\b|\bExcar\b', ['excar.com.cn', 'excar.com']),
 'Langqing': (r'\bLangqing\b', ['langqinggolfcart.com', 'langqing-ev.com', 'langqing.en.made-in-china.com']),
 'CENGO': (r'\bCENGO\b|\bCengo\b', ['cengocar.com']),
 'DAOD': (r'\bDAOD\b', ['daodev.cn', 'daodaev.en.made-in-china.com']),
 'Xunhu': (r'\bXunhu\b|\bXUNHU\b', ['hnxunhu.com', 'xunhuev.com']),
 'Taotao (Tao Motor)': (r'\bTaotao\b|Tao Motor', ['taotaomotor.com']),
 'Sanshuo': (r'\bSanshuo\b', ['sanshuosightseeing.com']),
 'Yatian': (r'\bYatian\b', ['gdyatian.en.made-in-china.com']),
 'EDACAR': (r'\bEDACAR\b|\bEdacar\b', ['edacar.cn']),
}
L = [json.loads(l) for f in sys.argv[1:] for l in open(f)]
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, 0 if b in CS else re.I)
        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  # subdomains count
    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:24} {r['mention']:>3}/{n} {r['mention']/n:>4.0%}  first {r['first']:>2}  cited {r['cited']:>2}")
