# logboek.py - de logbestanden van de klimaatmodule inlezen en opschonen
import csv
from datetime import datetime, timedelta

GRENZEN = {"T": (-10, 50), "RV": (0, 100)}      # wat in de module kan; daarbuiten is het een meetfout


def getal(tekst):
    """Tekst naar kommagetal; een lege cel (of een ontbrekende bij een halve regel) wordt None."""
    if tekst is None or tekst == "":
        return None
    return float(tekst)


def lees_dag(naam):
    """Alle regels van één dagbestand, als woordenboeken met getallen en een echte tijd."""
    rijen = []
    with open(naam, newline="", encoding="utf-8") as bestand:
        for r in csv.DictReader(bestand):
            rijen.append({"tijd": datetime.strptime(r["tijdstip"], "%Y-%m-%d %H:%M"),
                          "T": getal(r["temperatuur_C"]), "RV": getal(r["vocht_pct"]),
                          "verbruik": getal(r["verbruik_Wh"]), "zon": getal(r["zon_Wh"]),
                          "licht": getal(r["licht_lx"]), "bat": getal(r["batterij_V"])})
    return rijen


def lees_week(eerste=12, laatste=18):
    """De dagbestanden van 12 tot 18 oktober 2026 achter elkaar."""
    rijen = []
    for dag in range(eerste, laatste + 1):
        rijen += lees_dag(f"LOG/202610{dag}.CSV")
    return rijen


def buiten(waarde, grootheid):
    laag, hoog = GRENZEN[grootheid]
    return waarde is not None and not (laag <= waarde <= hoog)


def opschonen(rijen):
    """Onmogelijke waarden worden None (T en RV samen: ze komen van dezelfde sensor). Geeft hun aantal terug."""
    fout = 0
    for r in rijen:
        if buiten(r["T"], "T") or buiten(r["RV"], "RV"):
            r["T"] = r["RV"] = None
            fout += 1
    return fout


def gaten(rijen):
    """Paren van opeenvolgende regels die niet precies één minuut uit elkaar liggen."""
    return [(a["tijd"], b["tijd"]) for a, b in zip(rijen, rijen[1:]) if b["tijd"] - a["tijd"] != timedelta(minutes=1)]


if __name__ == "__main__":
    rijen = lees_week()
    print("regels ingelezen:", len(rijen), "- verwacht:", 7 * 24 * 60)
    print("lege temperatuur:", sum(1 for r in rijen if r["T"] is None))
    for r in rijen:
        if buiten(r["T"], "T") or buiten(r["RV"], "RV"):
            print("  onmogelijk:", r["tijd"], r["T"], r["RV"])
    print("opgeschoond:", opschonen(rijen), "regels")
    for a, b in gaten(rijen):
        print("gat in de tijd:", a, "->", b)
