"""DKDPulse CLI entry point.

Usage:
  python3 main.py --offline --top 10 --format md
  python3 main.py --offline --top 10 --format html

Live network mode is intentionally disabled (raises NotImplementedError).
"""

import argparse
import sys
from datetime import datetime
from pathlib import Path

from dkdpulse import classifier, novelty, digest, fetchers


PROJECT_ROOT = Path(__file__).resolve().parent
DATA_DIR = PROJECT_ROOT / "data"
OUTPUT_DIR = PROJECT_ROOT / "output"


def build_parser():
    p = argparse.ArgumentParser(
        prog="dkdpulse",
        description=(
            "DKDPulse — Diabetic Kidney Disease daily research curator. "
            "Aggregates PubMed + ClinicalTrials.gov + medRxiv records, "
            "tags drug × outcome × phenotype, ranks by novelty, "
            "and emits a daily digest. Research/educational use only."
        ),
    )
    p.add_argument(
        "--offline",
        action="store_true",
        help="Use synthetic mock data from data/. Required in this MVP build.",
    )
    p.add_argument(
        "--since",
        default=datetime.utcnow().strftime("%Y-%m-%d"),
        help="Run date (YYYY-MM-DD). Selects data/mock_*_<date>.json. Default: today (UTC).",
    )
    p.add_argument(
        "--top",
        type=int,
        default=10,
        help="Number of top-ranked records to include in the digest. Default: 10.",
    )
    p.add_argument(
        "--format",
        choices=["md", "html"],
        default="md",
        help="Digest output format. Default: md.",
    )
    p.add_argument(
        "--data-dir",
        default=str(DATA_DIR),
        help=f"Directory holding mock_*.json and seen_pmids.json. Default: {DATA_DIR}",
    )
    p.add_argument(
        "--output-dir",
        default=str(OUTPUT_DIR),
        help=f"Directory for digest output. Default: {OUTPUT_DIR}",
    )
    p.add_argument(
        "--no-update-seen",
        action="store_true",
        help="Do not append the digested PMIDs to seen_pmids.json.",
    )
    return p


def main(argv=None):
    args = build_parser().parse_args(argv)

    if not args.offline:
        sys.stderr.write(
            "ERROR: live network mode is disabled in this build. Re-run with --offline.\n"
            "       (Live PubMed/CTG/medRxiv calls are documented but not implemented.)\n"
        )
        return 2

    data_dir = Path(args.data_dir)
    out_dir = Path(args.output_dir)
    out_dir.mkdir(parents=True, exist_ok=True)

    # Load
    seen = fetchers.load_seen(data_dir)
    records = fetchers.fetch_all(data_dir, args.since, offline=True)
    if not records:
        sys.stderr.write(
            f"WARNING: no records loaded from {data_dir} for date {args.since}.\n"
        )

    # Classify
    tagged = classifier.annotate(records)

    # Rank
    ranked = novelty.rank(tagged, seen, top_n=args.top)

    # Render
    if args.format == "md":
        body = digest.render_markdown(ranked, run_date=args.since, top_n=args.top)
        out_path = out_dir / f"dkdpulse_digest_{args.since}.md"
    else:
        body = digest.render_html(ranked, run_date=args.since, top_n=args.top)
        out_path = out_dir / f"dkdpulse_digest_{args.since}.html"

    out_path.write_text(body, encoding="utf-8")

    # Update seen store
    if not args.no_update_seen:
        for r in ranked:
            ident = r.get("pmid") or r.get("nct_id") or r.get("doi")
            if ident:
                seen.add(str(ident))
        fetchers.save_seen(data_dir, seen)

    sys.stdout.write(
        f"DKDPulse: wrote {out_path} "
        f"({len(ranked)} of {len(tagged)} ranked, format={args.format})\n"
    )
    return 0


if __name__ == "__main__":
    sys.exit(main())
