import common
import report
from conftest import make_post

CFG = dict(common.DEFAULTS, instagram={"source": "apify", "accounts": ["acc"]},
           median_min_posts=3, pulse_multiplier=2.0)


def seed_baseline(con):
    for i, likes in enumerate([100, 100, 100]):
        make_post(con, "base{}".format(i), "acc", days_old=5 + i, likes=likes, comments=10)


def seed_tg(con, n_base=3, views_base=100, now=None):
    now = now or common.now_utc()
    for i in range(n_base):
        make_post(con, f"tgb{i}", "ch", 5 + i, None, None, views=views_base, now=now)
    make_post(con, "tghot", "ch", 1, None, None, views=views_base * 3, now=now)
    con.execute("UPDATE posts SET platform='telegram' WHERE account='ch'")
    con.commit()


def test_signal_above_median(con):
    seed_baseline(con)
    make_post(con, "hit", "acc", days_old=1, likes=250, comments=15)  # ×2.5
    signals = report.pulse_signals(con, CFG)
    assert len(signals) == 1
    s = signals[0]
    assert s["post_id"] == "hit" and s["metric"] == "likes"
    assert abs(s["ratio"] - 2.5) < 0.01


def test_no_signal_below_threshold(con):
    seed_baseline(con)
    make_post(con, "meh", "acc", days_old=1, likes=150, comments=15)  # ×1.5 < 2
    assert report.pulse_signals(con, CFG) == []


def test_old_posts_ignored(con):
    seed_baseline(con)
    make_post(con, "oldhit", "acc", days_old=10, likes=999, comments=99)
    assert report.pulse_signals(con, CFG) == []


def test_dedup_after_mark(con):
    seed_baseline(con)
    make_post(con, "hit", "acc", days_old=1, likes=250, comments=15)
    common.mark_alerted(con, ["hit"])
    assert report.pulse_signals(con, CFG) == []


def test_hidden_likes_falls_back_to_comments(con):
    seed_baseline(con)
    make_post(con, "hid", "acc", days_old=1, likes=None, comments=30)  # комменты ×3
    signals = report.pulse_signals(con, CFG)
    assert len(signals) == 1 and signals[0]["metric"] == "comments"
    assert signals[0]["likes_hidden"]


def test_format_pulse_has_permalink_every_signal(con):
    seed_baseline(con)
    make_post(con, "hit", "acc", days_old=1, likes=250, comments=15)
    text = report.format_pulse(report.pulse_signals(con, CFG))
    assert "https://www.instagram.com/p/hit/" in text
    assert "×2.5" in text


def test_tg_pulse_triggers_on_views(con):
    cfg = dict(common.DEFAULTS, telegram={"source": "web", "channels": ["ch"]},
               median_min_posts=3, pulse_multiplier=2.0)
    seed_tg(con)
    signals = report.pulse_signals(con, cfg)
    assert [s["post_id"] for s in signals] == ["tghot"]
    assert signals[0]["metric"] == "views" and signals[0]["ratio"] == 3.0


def test_stats_line_ig_shows_dash_for_missing_comments():
    """Task 6: '💬 None' раньше протекало в отчёт, когда comments_count не
    пришёл (например, из Meta Graph API) — должно быть тире, как для лайков."""
    p = {"platform": "instagram", "likes": None, "comments": None, "views": None}
    assert report.stats_line(p) == "❤️ — 💬 —"
    p2 = {"platform": "instagram", "likes": 10, "comments": None, "views": None}
    assert report.stats_line(p2) == "❤️ 10 💬 —"


def test_format_pulse_sections_when_both_platforms():
    ig = {"post_id": "p", "account": "acc", "platform": "instagram", "caption": "",
          "posted_at": "2026-07-20T00:00:00+00:00", "permalink": "u1",
          "likes": 10, "comments": 2, "views": None,
          "ratio": 2.5, "metric": "likes", "likes_hidden": False}
    tg = {"post_id": "tg:ch:1", "account": "ch", "platform": "telegram", "caption": "",
          "posted_at": "2026-07-20T00:00:00+00:00", "permalink": "u2",
          "likes": 5, "comments": None, "views": 300,
          "ratio": 3.0, "metric": "views", "likes_hidden": False}
    text = report.format_pulse([ig, tg])
    assert "📸 Instagram" in text and "✈️ Telegram" in text
    assert "по просмотрам" in text and "👁 300" in text
    single = report.format_pulse([tg])
    assert "✈️ Telegram" not in single      # одна платформа — без подзаголовка
