# testweek.py - de logbestanden van de klimaatmodule toetsen aan het programma van eisen
import csv

DAGEN = ["20210308", "20210309", "20210310", "20210311", "20210312", "20210313", "20210314"]
NAAM = ["ma", "di", "wo", "do", "vr", "za", "zo"]


def getal(tekst):
    """Tekst naar kommagetal; een lege cel (geen meting) wordt None."""
    return float(tekst) if tekst != "" else None


def lees(dag):
    with open("LOG/" + dag + ".CSV", newline="") as f:
        return [{k: (v if k == "tijdstip" else getal(v)) for k, v in r.items()} for r in csv.DictReader(f)]


def uur(r):
    return int(r["tijdstip"][11:13])


def dagrapport(rijen):
    dag = [r for r in rijen if 7 <= uur(r) < 22 and r["temperatuur_C"] is not None]
    nacht = [r for r in rijen if not 6 <= uur(r) < 22 and r["temperatuur_C"] is not None]
    par = [r["licht_lx"] / 54 + 200 * r["lampen_pwm"] / 255 for r in rijen if 6 <= uur(r) < 22]
    paren = list(zip(rijen, rijen[1:]))                    # (deze minuut, volgende minuut)
    return {
        "regels": len(rijen),
        "T_dag": (min(r["temperatuur_C"] for r in dag), max(r["temperatuur_C"] for r in dag)),
        "T_nacht": min(r["temperatuur_C"] for r in nacht),
        "zon": sum(r["zon_Wh"] for r in rijen) / 1000,                    # kWh
        "verbruik": sum(r["verbruik_Wh"] for r in rijen) / 1000,
        "soc": min(r["soc_pct"] for r in rijen),
        "lichtsom": sum(p * 60 for p in par) / 1e6,                       # mol/(m² dag)
        "verwarming": sum(r["verw_pct"] for r in rijen) / 100 / 60,       # uur
        "starts": sum(1 for a, b in paren if a["verw_pct"] == 0 and b["verw_pct"] > 0),
        "dak": sum(1 for a, b in paren if a["dak"] == 0 and b["dak"] > 0),
        "pH": max(r["pH"] for r in rijen),
        "EC": min(r["EC_mScm"] for r in rijen),
        "niveau": min(r["niveau_cm"] for r in rijen),
    }


week = [dagrapport(lees(dag)) for dag in DAGEN]
print("dag regels  T overdag  nacht   zon verbr  SoC licht verw starts dak  pH   EC niveau")
for naam, d in zip(NAAM, week):
    print(f"{naam}  {d['regels']:5d}  {d['T_dag'][0]:4.1f}-{d['T_dag'][1]:4.1f}  {d['T_nacht']:4.1f}  "
          f"{d['zon']:4.2f}  {d['verbruik']:4.2f}  {d['soc']:3.0f}  {d['lichtsom']:4.1f}  {d['verwarming']:3.1f}"
          f"  {d['starts']:3d}  {d['dak']:3d} {d['pH']:4.2f} {d['EC']:4.2f}  {d['niveau']:4.1f}")


def toets(code, tekst, fout):
    print(f"{code}  {tekst:38s} {'gehaald' if not fout else 'NIET: ' + ', '.join(fout)}")


print()
toets("K1", "overdag (7-22 h) nooit onder 17,5 C", [n for n, d in zip(NAAM, week) if d["T_dag"][0] < 17.5])
toets("K2", "'s nachts nooit onder 15,5 C", [n for n, d in zip(NAAM, week) if d["T_nacht"] < 15.5])
toets("K3", "nooit boven 30 C", [n for n, d in zip(NAAM, week) if d["T_dag"][1] > 30])
toets("L1", "lichtsom minstens 11,0 mol per dag", [n for n, d in zip(NAAM, week) if d["lichtsom"] < 11.0])
toets("E3", "laadtoestand nooit onder 20 %", [n for n, d in zip(NAAM, week) if d["soc"] < 20])
toets("H1", "EC nooit onder 1,2 mS/cm", [n for n, d in zip(NAAM, week) if d["EC"] < 1.2])
toets("H2", "pH nooit boven 6,5", [n for n, d in zip(NAAM, week) if d["pH"] > 6.5])
toets("D1", "1440 regels per dag", [n for n, d in zip(NAAM, week) if d["regels"] != 1440])
