import csv, statistics as st, sys

FILE, MAT_ABS, MAT_PCT, Z_LIMIT, YOY_BAND = sys.argv[1], 2000, 0.10, 3.5, 0.15

with open(FILE, newline="", encoding="utf-8") as f:
    rows = list(csv.DictReader(f))
months = [k for k in rows[0] if k[:2] == "20"]
cur, last_year, history = months[-1], months[0], months[-13:-1]

out = []
for r in rows:
    hist = [float(r[m]) for m in history]
    x = float(r[cur])
    med = st.median(hist)
    mad = st.median(abs(h - med) for h in hist)
    z = 0.6745 * (x - med) / mad if mad else (0.0 if x == med else float("inf"))
    gap = x - med
    material = abs(gap) >= MAT_ABS and abs(gap) >= MAT_PCT * abs(med)
    ly = float(r[last_year])
    yoy = (x - ly) / ly if ly else None
    flags = []
    if material and abs(z) > Z_LIMIT: flags.append("outlier")
    if med and x * med < 0: flags.append("sign flip")
    if med and x == 0 and abs(med) >= MAT_ABS: flags.append("missing")
    if flags and yoy is not None and abs(yoy) <= YOY_BAND: flags.append("matches last year")
    if flags:
        out.append((abs(gap), r["account"], r["name"], x, med, gap, z, yoy, ", ".join(flags)))

for g, a, n, x, med, gap, z, yoy, fl in sorted(out, reverse=True):
    zt = "n/a" if z == float("inf") else f"{z:.1f}"
    yt = "n/a" if yoy is None else f"{yoy:+.0%}"
    print(f"{a}|{n}|{x:,.0f}|{med:,.0f}|{gap:+,.0f}|{zt}|{yt}|{fl}")
