"""Score the chains in starts.csv / steps.csv under rule.py. Writes results.txt."""

import csv
import os
import statistics
from collections import Counter

import rule

HERE = os.path.dirname(os.path.abspath(__file__))


def load():
    with open(os.path.join(HERE, "starts.csv")) as f:
        starts = [r["start"] for r in csv.DictReader(f)]
    with open(os.path.join(HERE, "steps.csv")) as f:
        steps = {r["asked"]: (r["resolved"] or None, r["next"] or None) for r in csv.DictReader(f)}
    return starts, steps


def chain(start, steps):
    """(outcome, path of resolved titles, loop entry title or None)."""
    seen, path, asked = set(), [], start
    for _ in range(rule.CAP + 1):
        resolved, nxt = steps[asked]
        if resolved is None:
            return "dead_end", path, None
        if resolved == "Philosophy":
            path.append(resolved)
            return "philosophy", path, None
        if resolved in seen:
            return "loop", path, resolved
        seen.add(resolved)
        path.append(resolved)
        if nxt is None:
            return "dead_end", path, None
        asked = nxt
    return "cap", path, None


def main():
    starts, steps = load()
    out = Counter()
    lengths, loops, ends = [], Counter(), Counter()
    rows = []
    for s in starts:
        o, path, entry = chain(s, steps)
        out[o] += 1
        rows.append((s, o, len(path) - 1 if path else 0))
        if o == "philosophy":
            lengths.append(len(path) - 1)
        elif o == "loop":
            loops[entry] += 1
        elif o == "dead_end":
            ends[path[-1] if path else s] += 1
    v = rule.verdicts(out["philosophy"], len(starts))
    L = [f"starts {len(starts)}, pages fetched {len(steps)}",
         "outcomes " + ", ".join(f"{k} {out[k]}" for k in ("philosophy", "loop", "dead_end", "cap")),
         f"share reaching Philosophy {v['p']:.3f}, Wilson 95 % {v['lo']:.3f} to {v['hi']:.3f}",
         f"claim A (about 97 %): {v['A']}",
         f"claim B (almost none): {v['B']}",
         f"median steps of the philosophy chains: {statistics.median(lengths) if lengths else 'n/a'}",
         "loops end in (entry title, chains):"]
    L += [f"  {t}: {c}" for t, c in loops.most_common(15)]
    L += ["dead ends at (title, chains):"] + [f"  {t}: {c}" for t, c in ends.most_common(10)]
    open(os.path.join(HERE, "results.txt"), "w").write("\n".join(L) + "\n")
    with open(os.path.join(HERE, "chains.csv"), "w", newline="") as f:
        w = csv.writer(f)
        w.writerow(["start", "outcome", "steps"])
        w.writerows(rows)
    print("\n".join(L))


if __name__ == "__main__":
    main()
