"""Parse SWPC daily edited event lists (raw/events/*events.txt) -> data/xra_events.csv (one row per GOES XRA event)
and data/flare_days.csv (per UT day: n_C, n_M, n_X, max class flux, file present).
Event day = file date (events listed by begin time on that UT day). If one event number has several XRA lines
(several GOES satellites), the first listed line is used."""
import re, glob, os, csv, datetime as dt
ROOT = os.environ.get('FLARE_ROOT', '/work/flare-forecasts')
SCALE = {'A': 1e-8, 'B': 1e-7, 'C': 1e-6, 'M': 1e-5, 'X': 1e-4}
ev, days = [], {}
for f in sorted(glob.glob(f'{ROOT}/raw/events/*events.txt')):
    ymd = os.path.basename(f)[:8]; d = f'{ymd[:4]}-{ymd[4:6]}-{ymd[6:]}'
    seen = set(); peak = 0.0; peak_old = 0.0; n = {'C': 0, 'M': 0, 'X': 0}
    for line in open(f, errors='replace'):
        if ' XRA ' not in line: continue
        tok = line.split()
        evno = tok[0]
        m = re.search(r'XRA\s+1-8A\s+([ABCMX])(\d+(?:\.\d+)?)', line)
        if not m or evno in seen: continue
        seen.add(evno)
        cls, mag = m.group(1), float(m.group(2)); flux = SCALE[cls] * mag
        sat = re.search(r'\s(G\d\d|GO\d)\s', line); sat = sat.group(1) if sat else ''
        # GOES-16 and later report unscaled fluxes; legacy GOES (<=15) carried the 0.7 factor. flux_old = legacy scale.
        flux_old = flux * 0.7 if sat in ('G16', 'G17', 'G18', 'G19') else flux
        ev.append({'date': d, 'event': evno, 'begin': tok[1] if len(tok) > 1 else '', 'sat': sat, 'class': f'{cls}{m.group(2)}', 'flux': flux, 'flux_old': flux_old})
        peak = max(peak, flux); peak_old = max(peak_old, flux_old)
        if flux >= 1e-4: n['X'] += 1
        elif flux >= 1e-5: n['M'] += 1
        elif flux >= 1e-6: n['C'] += 1
    days[d] = {'date': d, 'n_C': n['C'], 'n_M': n['M'], 'n_X': n['X'], 'peak_flux': peak, 'peak_flux_old': peak_old, 'n_xra': len(seen)}
os.makedirs(f'{ROOT}/data', exist_ok=True)
with open(f'{ROOT}/data/xra_events.csv', 'w', newline='') as fh:
    w = csv.DictWriter(fh, fieldnames=['date', 'event', 'begin', 'sat', 'class', 'flux', 'flux_old']); w.writeheader(); w.writerows(ev)
with open(f'{ROOT}/data/flare_days.csv', 'w', newline='') as fh:
    w = csv.DictWriter(fh, fieldnames=['date', 'n_C', 'n_M', 'n_X', 'peak_flux', 'peak_flux_old', 'n_xra']); w.writeheader(); w.writerows(days.values())
print(len(days), 'days;', len(ev), 'XRA events; days with 0 XRA:', sum(1 for v in days.values() if v['n_xra'] == 0))
