"""task-2370 P2 — daily_digest 검증."""
import random
import sys
from datetime import datetime, timedelta, timezone
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[2]))

from scripts.daily_digest import (  # pyright: ignore[reportMissingImports]
    _filter_yesterday_tier1_merged,
    _filter_tier3_pending,
    _format_card,
    _parse_audit_log,
    _sample_for_review,
    _yesterday_range_kst,
    run_digest,
)

KST = timezone(timedelta(hours=9))


def test_parse_audit_log_missing_returns_empty(tmp_path):
    result = _parse_audit_log(tmp_path / "no_such_log.log")
    assert result == []


def test_parse_audit_log_jsonl(tmp_path):
    log = tmp_path / "audit.log"
    log.write_text(
        '{"task_id":"task-1","tier":"tier1"}\n'
        '\n'
        '{"task_id":"task-2","tier":"tier3"}\n'
    )
    rs = _parse_audit_log(log)
    assert len(rs) == 2
    assert rs[0]["task_id"] == "task-1"


def test_filter_yesterday_tier1_merged():
    yesterday_start = datetime(2026, 5, 1, 0, 0, tzinfo=KST)
    today_start = datetime(2026, 5, 2, 0, 0, tzinfo=KST)
    records = [
        {"task_id": "a", "tier": "tier1", "outcome": "merged", "timestamp": "2026-05-01T10:00:00+09:00"},
        {"task_id": "b", "tier": "tier1", "outcome": "merged", "timestamp": "2026-04-30T10:00:00+09:00"},  # 그저께 — 제외
        {"task_id": "c", "tier": "tier2", "outcome": "merged", "timestamp": "2026-05-01T10:00:00+09:00"},  # 다른 tier — 제외
        {"task_id": "d", "tier": "tier1", "outcome": "rejected", "timestamp": "2026-05-01T10:00:00+09:00"},  # rejected — 제외
        {"task_id": "e", "tier": "tier1", "outcome": "merged", "timestamp": "2026-05-02T01:00:00+09:00"},  # 오늘 — 제외
    ]
    result = _filter_yesterday_tier1_merged(records, yesterday_start, today_start)
    assert [r["task_id"] for r in result] == ["a"]


def test_filter_tier3_pending():
    yesterday_start = datetime(2026, 5, 1, 0, 0, tzinfo=KST)
    today_start = datetime(2026, 5, 2, 0, 0, tzinfo=KST)
    records = [
        {"task_id": "x", "tier": "tier3", "outcome": "escalated", "timestamp": "2026-05-01T15:00:00+09:00"},
        {"task_id": "y", "tier": "tier3", "outcome": "merged", "timestamp": "2026-05-01T15:00:00+09:00"},  # merged — 제외
    ]
    result = _filter_tier3_pending(records, yesterday_start, today_start)
    assert [r["task_id"] for r in result] == ["x"]


def test_sample_for_review_zero_when_empty():
    assert _sample_for_review([]) == []


def test_sample_for_review_ceils_to_at_least_one():
    merged = [{"task_id": f"t-{i}"} for i in range(10)]
    rng = random.Random(42)
    result = _sample_for_review(merged, rate=0.1, rng=rng)
    assert len(result) == 1


def test_sample_for_review_zero_when_below_one():
    """5건 * 0.1 = 0.5 → ceil = 1, 단 SAMPLE_RATE가 0이면 0."""
    merged = [{"task_id": f"t-{i}"} for i in range(5)]
    rng = random.Random(0)
    # ceil(5 * 0.1) = 1
    result = _sample_for_review(merged, rate=0.1, rng=rng)
    assert len(result) == 1


def test_sample_for_review_caps_at_total():
    merged = [{"task_id": "t-1"}]
    rng = random.Random(0)
    result = _sample_for_review(merged, rate=10.0, rng=rng)
    assert len(result) == 1


def test_format_card_empty():
    card = _format_card([], [], [], "2026-05-01")
    assert "0건" in card
    assert "2026-05-01" in card


def test_format_card_with_data():
    merged = [{"task_id": "task-1", "level": 1, "diff_files": ["a.py"], "diff_loc": 50}]
    reviews = [{"task_id": "task-1", "pr_number": 99}]
    pending = [{"task_id": "task-2"}]
    card = _format_card(merged, reviews, pending, "2026-05-01")
    assert "task-1" in card
    assert "task-2" in card
    assert "1건" in card  # Tier 1 1건


def test_run_digest_graceful_fallback_no_audit_log(tmp_path, monkeypatch):
    """audit log 없으면 0건 카드로 정상 진행."""
    monkeypatch.setenv("DIGEST_DRY_RUN", "1")
    result = run_digest(audit_path=tmp_path / "no_log.log")
    assert result["merged_count"] == 0
    assert result["pending_count"] == 0
    assert "0건" in result["card_text"]


def test_yesterday_range_is_kst():
    now = datetime(2026, 5, 2, 9, 30, tzinfo=KST)
    ys, ts = _yesterday_range_kst(now)
    assert ys == datetime(2026, 5, 1, 0, 0, tzinfo=KST)
    assert ts == datetime(2026, 5, 2, 0, 0, tzinfo=KST)
