#!/usr/bin/env python3
"""Build the first-visit dashboard watchlist from current screener outputs."""

import csv
import os
import tempfile
from pathlib import Path


ROOT = Path(__file__).parent
SOURCES = {
    "rk": ROOT / "data" / "outputs" / "scores_compact.csv",
    "kul": ROOT / "data" / "outputs" / "kulamagi_compact.csv",
    "burry": ROOT / "data" / "outputs" / "burry_compact.csv",
    "buffett": ROOT / "data" / "outputs" / "buffett_compact.csv",
    "combined": ROOT / "data" / "share" / "combined_setups.csv",
}
DEFAULT_WATCHLIST = [
    ("EOLS", "rk"),
    ("AIRO", "rk"),
    ("ZS", "rk"),
    ("UI", "rk"),
    ("CF", "rk"),
    ("MXL", "rk"),
    ("IAG", "burry"),
    ("CTRM", "burry"),
    ("FRSH", "burry"),
    ("DUOL", "burry"),
    ("CVLT", "buffett"),
    ("TNET", "buffett"),
    ("RHI", "buffett"),
    ("AMR", "buffett"),
    ("DDI", "combined"),
    ("FICO", "combined"),
]
OUTPUT = ROOT / "data" / "share" / "default_watchlist.csv"


def load_source(path: Path) -> dict[str, dict[str, str]]:
    if not path.exists():
        raise FileNotFoundError(f"Missing screener output: {path}")
    with path.open(newline="", encoding="utf-8") as handle:
        return {
            row["ticker"].upper(): row
            for row in csv.DictReader(handle)
            if row.get("ticker")
        }


def main() -> None:
    loaded = {mode: load_source(path) for mode, path in SOURCES.items()}
    rows: list[dict[str, str]] = []
    missing: list[str] = []

    for ticker, mode in DEFAULT_WATCHLIST:
        source_row = loaded[mode].get(ticker)
        if source_row is None:
            missing.append(f"{ticker} ({mode})")
            continue
        rows.append({**source_row, "ticker": ticker, "_srcMode": mode})

    if missing:
        raise RuntimeError("Default watchlist tickers missing from source outputs: " + ", ".join(missing))

    fields = ["ticker", "_srcMode"]
    fields.extend(sorted({key for row in rows for key in row} - set(fields)))
    OUTPUT.parent.mkdir(parents=True, exist_ok=True)
    with tempfile.NamedTemporaryFile(
        "w", newline="", encoding="utf-8", dir=OUTPUT.parent, delete=False
    ) as handle:
        writer = csv.DictWriter(handle, fieldnames=fields)
        writer.writeheader()
        writer.writerows(rows)
        temp_path = Path(handle.name)
    os.replace(temp_path, OUTPUT)
    print(f"Wrote {len(rows)} default watchlist rows to {OUTPUT.relative_to(ROOT)}")


if __name__ == "__main__":
    main()
