# -*- coding: utf-8 -*-
"""task-2673 existing branch regression — Critical7 / MERGE_READY / Gemini stale.

수정 목표 2 (5 enum evaluation 보강) 의 기존 분기 regression.
"""
from __future__ import annotations

import sys
from pathlib import Path

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

import pytest  # noqa: E402

from utils.pr_watcher_terminal_state_classifier import (  # noqa: E402
    CI_FAILED_NON_REMEDIABLE,
    GEMINI_EXTERNAL_TRIGGER_STALE,
    MERGE_READY,
    PRSnapshot,
    classify,
)


def test_critical_failure_returns_ci_failed_non_remediable(
    critical_failure_pr_data, empty_th_data, expected_head
):
    snap = PRSnapshot.from_gh(critical_failure_pr_data, empty_th_data)
    state, reason = classify(
        snap,
        elapsed_watcher_sec=120,
        expected_head=expected_head,
    )
    assert state == CI_FAILED_NON_REMEDIABLE
    assert "qc-check" in reason


def test_merge_ready_clean_path(
    merge_ready_pr_data, all_resolved_th_data, expected_head
):
    snap = PRSnapshot.from_gh(merge_ready_pr_data, all_resolved_th_data)
    state, reason = classify(
        snap,
        elapsed_watcher_sec=120,
        expected_head=expected_head,
    )
    assert state == MERGE_READY
    assert "0 unresolved" in reason


def test_gemini_stale_when_head_committed_old(
    expected_head, empty_th_data, stale_gemini_review
):
    pr = {
        "headRefOid": expected_head,
        "mergeStateStatus": "BEHIND",
        "reviewDecision": "",
        "statusCheckRollup": [
            {"name": "cancel-kill-switch", "conclusion": "SUCCESS"},
        ],
        "reviews": [stale_gemini_review],
    }
    snap = PRSnapshot.from_gh(pr, empty_th_data)
    state, reason = classify(
        snap,
        elapsed_watcher_sec=300,
        expected_head=expected_head,
        head_committed_utc=1779700000,
        now_utc_sec=1779710000,  # 10000s 경과 > 3600
        gemini_stale_threshold_sec=60 * 60,
    )
    assert state == GEMINI_EXTERNAL_TRIGGER_STALE
    assert "fresh gemini review missing" in reason


def test_critical_failure_takes_priority_over_head_drift(
    critical_failure_pr_data, empty_th_data, expected_head
):
    """우선순위 1 (Critical7) 이 head drift 보다 먼저 발화."""
    pr = dict(critical_failure_pr_data)
    pr["headRefOid"] = "deadbeef" * 5  # 길이 40 hex
    snap = PRSnapshot.from_gh(pr, empty_th_data)
    state, _ = classify(
        snap,
        elapsed_watcher_sec=120,
        expected_head=expected_head,
    )
    assert state == CI_FAILED_NON_REMEDIABLE
