#!/usr/bin/env python3
"""Findings tables from coded.csv. Run after coding is complete."""

import csv
from collections import Counter, defaultdict
from pathlib import Path

ROOT = Path(__file__).parent

CLASS = {
    "YNAB": "zero-based", "EveryDollar": "zero-based", "Goodbudget": "zero-based",
    "Rocket Money": "bank-linked", "Copilot Money": "bank-linked",
    "Monarch Money": "bank-linked", "PocketGuard": "bank-linked",
    "Money Manager (Realbyte)": "manual", "Spendee": "manual",
}

ORDER = ["sync", "bugs", "redesign", "price", "missing", "support", "upkeep", "rant"]


def pct(n, d):
    return f"{n / d:.0%}" if d else "-"


def main():
    with open(ROOT / "coded.csv") as f:
        rows = list(csv.DictReader(f))
    total = len(rows)
    print(f"total coded: {total}\n")

    dupes = [k for k, v in Counter(r["review_id"] for r in rows).items() if v > 1]
    if dupes:
        print(f"WARNING duplicate ids: {dupes}\n")

    overall = Counter(r["category"] for r in rows)
    print("== Overall ==")
    for cat in ORDER:
        print(f"{cat:10} {overall[cat]:>5}  {pct(overall[cat], total)}")

    print("\n== By app class ==")
    by_class = defaultdict(Counter)
    class_totals = Counter()
    for r in rows:
        cls = CLASS[r["app"]]
        by_class[cls][r["category"]] += 1
        class_totals[cls] += 1
    header = f"{'category':10}" + "".join(f"{c:>14}" for c in ["bank-linked", "zero-based", "manual"])
    print(header)
    for cat in ORDER:
        line = f"{cat:10}"
        for cls in ["bank-linked", "zero-based", "manual"]:
            line += f"{by_class[cls][cat]:>7} {pct(by_class[cls][cat], class_totals[cls]):>6}"
        print(line)
    print("n per class:", dict(class_totals))

    print("\n== By app ==")
    by_app = defaultdict(Counter)
    app_totals = Counter()
    for r in rows:
        by_app[r["app"]][r["category"]] += 1
        app_totals[r["app"]] += 1
    for app in sorted(by_app):
        top = ", ".join(f"{c} {pct(n, app_totals[app])}" for c, n in by_app[app].most_common(3))
        print(f"{app:26} n={app_totals[app]:>3}  top: {top}")

    print("\n== Upkeep bucket (the abandonment story) ==")
    for r in rows:
        if r["category"] == "upkeep":
            print(f"  {r['app']:26} {r['rating']}* {r['date']}  {r['gist']}")

    print("\n== Date coverage per app (coded corpus) ==")
    dates = defaultdict(list)
    for r in rows:
        dates[r["app"]].append(r["date"])
    for app in sorted(dates):
        ds = sorted(dates[app])
        print(f"{app:26} {ds[0]} .. {ds[-1]}")


if __name__ == "__main__":
    main()
