# collect.py
"""Сбор трёх потоков → сырой дайджест в волт + KEY=value для bash-обёртки."""
import argparse
import json
import os
from datetime import datetime, timedelta, timezone
from pathlib import Path

import adapt
import fetch_reddit
import fetch_rss
import fetch_tg
import pulse
import state

ROOT = Path(__file__).resolve().parent


def has_signals(tg_hot, reddit_hot, rss_new) -> bool:
    return bool(tg_hot or reddit_hot or rss_new)


def fresh_entries(entries, now, max_age_days):
    """Отсечь RSS-записи старше max_age_days (бэклог первого прогона). Без даты — оставляем."""
    cutoff = now - timedelta(days=max_age_days)
    out = []
    for e in entries:
        pub = e.get("published") or ""
        if not pub:
            out.append(e)
            continue
        try:
            ts = pulse._parse_ts(pub)
        except ValueError:
            out.append(e)
            continue
        if ts >= cutoff:
            out.append(e)
    return out


def _preview(text, limit=200):
    text = " ".join((text or "").split())
    return text[:limit] + ("…" if len(text) > limit else "")


def build_digest_md(today, tg_hot, reddit_hot, rss_new) -> str:
    lines = ["# Трендвотч Марса — сырьё {}".format(today), ""]
    lines.append("## Telegram (залетело по медиане канала)")
    if tg_hot:
        for p in tg_hot:
            kind = "реакц." if p.get("metric_kind") == "reactions" else "просм."
            lines.append("- **@{}** ×{} ({} {}) — {} — {}".format(
                p["account"], p.get("ratio"), p.get("metric"), kind,
                _preview(p["caption"]), p["permalink"]))
    else:
        lines.append("_(пусто)_")
    lines.append("")
    lines.append("## Reddit (залетело по медиане сабреддита)")
    if reddit_hot:
        for p in reddit_hot:
            lines.append("- **r/{}** — {} — {}".format(
                p["account"], _preview(p["caption"]), p["permalink"]))
    else:
        lines.append("_(пусто)_")
    lines.append("")
    lines.append("## RSS — сырьё для кластеризации (истории с 2+ source — оставить)")
    if rss_new:
        for e in rss_new:
            lines.append("- [{}] {} — {}".format(e["source"], e["title"], e["link"]))
    else:
        lines.append("_(пусто)_")
    lines.append("")
    return "\n".join(lines)


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--signals", action="store_true")
    ap.add_argument("--config", default=str(ROOT / "config.json"))
    ap.add_argument("--vault", default=None)
    ap.add_argument("--db", default=str(ROOT / "data" / "state.db"))
    args = ap.parse_args()

    cfg = json.loads(Path(args.config).read_text(encoding="utf-8"))
    vault = Path(args.vault or cfg.get("vault_root") or ".")
    now = datetime.now(timezone.utc)
    k = cfg["pulse_multiplier"]
    if args.signals:
        window_start = now - timedelta(days=cfg["window_days_signals"])
        limit = cfg["fetch_limit_signals"]
        rd_window = "week"
    else:
        window_start = now - timedelta(days=cfg["window_days_full"])
        limit = cfg["fetch_limit_full"]
        rd_window = "week"

    con = state.connect(args.db)

    # --- TG
    fw_recs, _, _ = fetch_tg.fetch_web(cfg["tg_channels"], limit)
    tg_recs = adapt.tg_to_records(fw_recs)
    tg_hot = [p for p in pulse.hot_posts(tg_recs, k, window_start, now)
              if not state.was_seen_post(con, p["post_id"])]

    # --- Reddit: top.rss (анонимный JSON заблокирован); лента уже топ-ранжирована,
    # кап на сабреддит в фетчере; окно даёт сам ?t=week, анти-повтор — state.
    ua = os.environ.get("REDDIT_USER_AGENT", "mars-trendwatch/1.0")
    rd_recs, _ = fetch_reddit.fetch_reddit(cfg["subreddits"], cfg.get("reddit_top_n", 5),
                                           ua, window=rd_window)
    reddit_hot = [p for p in rd_recs if not state.was_seen_post(con, p["post_id"])]

    state.mark_posts_seen(con, [p["post_id"] for p in tg_hot + reddit_hot])

    # --- RSS (дедуп по link через state)
    rss_recs, _ = fetch_rss.fetch_feeds(cfg["feeds"])
    rss_new = state.new_entries(con, rss_recs)
    rss_new = fresh_entries(rss_new, now, cfg.get("rss_first_run_days", 7))

    # --- сырой дайджест в волт
    today = now.strftime("%Y-%m-%d")
    out_dir = vault / cfg["digest_dir_rel"]
    out_dir.mkdir(parents=True, exist_ok=True)
    digest_path = out_dir / "{{mars}} {{source}} трендвотч сырой – {}.md".format(today)
    digest_path.write_text(build_digest_md(today, tg_hot, reddit_hot, rss_new),
                           encoding="utf-8")

    print("DIGEST={}".format(digest_path))
    print("HAS_SIGNALS={}".format(1 if has_signals(tg_hot, reddit_hot, rss_new) else 0))


if __name__ == "__main__":
    main()
