import csv
import json
from collections import defaultdict
from datetime import date, datetime, timedelta
from pathlib import Path

root = Path(__file__).resolve().parents[1]
bundle = root / 'bundle'
ww_rows = list(csv.DictReader((bundle / 'data/nwss_nyc_percentile.csv').open()))
cases_rows = list(csv.DictReader((bundle / 'data/nyc_cases_7day.csv').open()))
assert all(r['key_plot_id'].startswith('NWSS_ny_') and r['county_names'] in
           {'Bronx', 'Kings', 'New York', 'Queens', 'Richmond'} for r in ww_rows)
assert len({(r['key_plot_id'], r['date_end']) for r in ww_rows}) == len(ww_rows)
assert len({r['date_of_interest'] for r in cases_rows}) == len(cases_rows)
weighted = defaultdict(lambda: [0.0, 0.0])
for r in ww_rows:
    d = date.fromisoformat(r['date_end'][:10])
    pop = float(r['population_served'])
    value = float(r['percentile'])
    assert pop > 0 and 0 <= value <= 100
    weighted[d][0] += pop * value
    weighted[d][1] += pop
ww = {d: s / n for d, (s, n) in weighted.items()}
cases = {datetime.strptime(r['date_of_interest'], '%m/%d/%Y').date():
         float(r['CASE_COUNT_7DAY_AVG']) for r in cases_rows}
rows = []
for d in sorted(ww):
    earlier, later = d - timedelta(days=7), d + timedelta(days=7)
    if date(2023, 4, 1) <= d <= date(2025, 6, 30) and earlier in ww and later in cases and d in cases and cases[d] >= 50:
        rows.append((int(cases[later] / cases[d] >= 1.10), ww[d], ww[earlier]))

def pairwise_auc(column):
    positive = [r[column] for r in rows if r[0]]
    negative = [r[column] for r in rows if not r[0]]
    wins = sum((p > n) + 0.5 * (p == n) for p in positive for n in negative)
    return wins / (len(positive) * len(negative))

a0, a7 = pairwise_auc(1), pairwise_auc(2)
result = {'n_days': len(rows), 'n_pos': sum(r[0] for r in rows),
          'n_neg': sum(not r[0] for r in rows), 'auroc_lag0': round(a0, 6),
          'auroc_lag7': round(a7, 6), 'delta_auroc': round(a7 - a0, 6),
          'success_lag_beats_contemporaneous': a7 > a0}
declared = json.loads((bundle / 'results/R1.json').read_text())
assert all(result[k] == declared[k] for k in result)
result['check'] = 'All compared values match; independent pairwise AUROC, not the submitted rank implementation.'
(root / 'evidence/independent-check.json').write_text(json.dumps(result, indent=2))
print(json.dumps(result, indent=2))
