import json, os, glob
from collections import defaultdict

ATTENDEE_NAME = {}
for p in glob.glob('cfr_search/*.eid'):
    eid = int(open(p).read())
    name = os.path.basename(p).replace('.eid','').replace('_',' ')
    ATTENDEE_NAME[eid] = name

POLICY_ORGS = [
    'Council on Foreign Relations', 'Bilderberg Group', 'Bilderberg',
    'Trilateral Commission',
    'Atlantic Council',
    'Aspen Institute', 'Aspen Strategy Group',
    'RAND Corporation', 'RAND Corp',
    'Carnegie Endowment',
    'Hoover Institution',
    'Cato Institute',
    'Heritage Foundation',
    'Peterson Institute',
    'International Crisis Group',
    'German Marshall Fund',
    'Center for Strategic and International', 'CSIS',
    'Chatham House',
    'Rhodes Trust', 'Rhodes Scholar',
    'World Economic Forum', 'WEF',
    'Brookings Institution',
    'Hudson Institute',
    'New America Foundation',
    'Wilson Center', 'Woodrow Wilson Center',
    'Asia Society',
    'Asia Foundation',
    'National Endowment for Democracy', 'NED',
    'Rockefeller Foundation', 'Rockefeller Brothers Fund',
    'Open Society', 'Soros Foundation',
    'Ford Foundation', 'MacArthur Foundation', 'Hewlett Foundation',
    'Gates Foundation',
    'Skoll Foundation',
    'Clinton Foundation', 'Biden Foundation', 'Obama Foundation',
    'Schmidt Futures',
    'Open Philanthropy',
    'Omidyar Network', 'Luminate',
    'Smith Richardson Foundation',
    'Koch Foundation', 'Koch Family Foundation',
    'Olin Foundation',
    'NAACP Legal Defense',
    'Committee for Economic Development',
    'Council on Foreign Relations',
    'Rhodes Scholarships',
    'French-American Foundation',
    'British-American Business',
    'American Academy of Arts and Sciences',
    'American Philosophical Society',
    'Council of Economic Advisers',
    'Committee for a Responsible Federal Budget',
    'Business Roundtable',
    'Rountable',
    'National Bureau of Economic Research', 'NBER',
    'Cato Institute',
    'Foreign Policy Research Institute',
    'The Cohen Group',
    'Vickers Group',
]

org_to_attendees = defaultdict(set)
org_to_descriptions = defaultdict(list)

for path in glob.glob('cfr_rels/*.json') + glob.glob('rels/*.json') + glob.glob('rels2/*.json'):
    try:
        d = json.load(open(path))
    except:
        continue
    for r in d.get('data', []):
        a = r['attributes']
        e1 = a.get('entity1_id')
        e2 = a.get('entity2_id')
        desc = a.get('description','')
        # determine attendee
        attendee_id = e1 if e1 in ATTENDEE_NAME else (e2 if e2 in ATTENDEE_NAME else None)
        if not attendee_id: continue
        attendee_name = ATTENDEE_NAME[attendee_id]
        # match org
        for org in POLICY_ORGS:
            if org.lower() in desc.lower():
                org_to_attendees[org].add(attendee_name)
                org_to_descriptions[org].append((attendee_name, desc[:140]))
                break

# Sort and print
print(f"Total policy orgs with attendee connections: {len(org_to_attendees)}")
print()
sorted_orgs = sorted(org_to_attendees.items(), key=lambda x: -len(x[1]))
for org, attendees in sorted_orgs:
    if len(attendees) >= 1:
        print(f"  [{len(attendees):>2}] {org}")
        # unique descriptions (one per attendee for readability)
        seen = set()
        for attendee, desc in org_to_descriptions[org]:
            if attendee not in seen:
                print(f"        {attendee}: {desc}")
                seen.add(attendee)
        print()
