"""Independent check of the primary setting (3 h jobs, up to 6 h delay) from the raw NESO responses."""
import sys, json, gzip, datetime as dt
from fractions import Fraction
from pathlib import Path
from collections import defaultdict

root = Path(sys.argv[1])
vals = {}
for src in json.loads((root / 'data/SOURCES.json').read_text()):
    for rec in json.loads(gzip.decompress((root / src['path']).read_bytes()))['data']:
        t = dt.datetime.strptime(rec['from'], '%Y-%m-%dT%H:%MZ')
        a = rec['intensity'].get('actual')
        if t in vals and vals[t] != a:
            raise SystemExit('conflict')
        vals[t] = a
byday = defaultdict(dict)
for t, a in vals.items():
    if a is None or not (2023 <= t.year <= 2025):
        continue
    byday[t.date()][t.hour * 2 + t.minute // 30] = Fraction(str(a))
full = {d: [s[i] for i in range(48)] for d, s in byday.items() if len(s) == 48}

def seas(d):
    return {12: 'W', 1: 'W', 2: 'W', 3: 'Sp', 4: 'Sp', 5: 'Sp', 6: 'Su', 7: 'Su', 8: 'Su'}.get(d.month, 'A')

def mean(rows):
    return [sum(r[i] for r in rows) / len(rows) for i in range(48)]

train = {d: v for d, v in full.items() if d.year == 2023}
prof = {s: mean([v for d, v in train.items() if seas(d) == s]) for s in ('W', 'Sp', 'Su', 'A')}
D, W = 6, 12
out = {}
for year in (2024, 2025):
    n = tot_imm = tot_s = tot_r = delay = higher = 0
    d = dt.date(year, 1, 1)
    while d.year == year:
        nxt = d + dt.timedelta(days=1)
        prior = [d - dt.timedelta(days=k) for k in range(2, 30) if d - dt.timedelta(days=k) in full]
        if d in full and nxt in full and len(prior) >= 21:
            obs = full[d] + full[nxt]
            sp = prof[seas(d)] + prof[seas(nxt)]
            rp = mean([full[p] for p in prior]) * 2
            win = lambda xs, s: sum(xs[s:s + D])
            for r in range(48):
                cands = range(r, r + W + 1)
                s_s = min(cands, key=lambda s: win(sp, s))
                s_r = min(cands, key=lambda s: win(rp, s))
                base, got = win(obs, r), win(obs, s_s)
                n += 1; tot_imm += base; tot_s += got; tot_r += win(obs, s_r)
                delay += s_s - r; higher += got > base
        d = nxt
    out[year] = {'jobs': n, 'percent_reduction': round(float(100 * (tot_imm - tot_s) / tot_imm), 6),
                 'higher_percent': round(100 * higher / n, 6), 'mean_delay_hours': round(delay / n / 2, 6),
                 'mean_intensity': round(float(tot_s / n / D), 6),
                 'recent_minus_seasonal': round(float((tot_r - tot_s) / n / D), 6)}
print(json.dumps(out, indent=1))
