"""Parse CPC ONI tables (ERSSTv5 page raw/oni_v5.html, ERSSTv6 page raw/oni_v6.html; values tabulated to 0.1 degC)
into data/oni_v5.csv and data/oni_v6.csv (columns SEAS, YR, ANOM; YR = year of the season's centre month)."""
import re, html, os, csv
R = os.environ.get('ENSO_ROOT', '/work/enso-outlooks')
SEAS = ['DJF', 'JFM', 'FMA', 'MAM', 'AMJ', 'MJJ', 'JJA', 'JAS', 'ASO', 'SON', 'OND', 'NDJ']
for v in ('v5', 'v6'):
    s = open(f'{R}/raw/oni_{v}.html', errors='replace').read(); out = []
    for r in re.findall(r'<tr[^>]*>(.*?)</tr>', s, re.S):
        c = [' '.join(html.unescape(re.sub(r'<[^>]+>', '', x)).split()) for x in re.findall(r'<t[dh][^>]*>(.*?)</t[dh]>', r, re.S)]
        if 2 <= len(c) <= 13 and re.fullmatch(r'\d{4}', c[0]):
            for i, val in enumerate(c[1:]):
                if re.fullmatch(r'-?\d+(\.\d+)?', val): out.append(dict(SEAS=SEAS[i], YR=int(c[0]), ANOM=float(val)))
    with open(f'{R}/data/oni_{v}.csv', 'w', newline='') as fh:
        w = csv.DictWriter(fh, fieldnames=['SEAS', 'YR', 'ANOM']); w.writeheader(); w.writerows(out)
    print(v, len(out), 'seasons, last', out[-1])
