"""Common fixtures for Phase 3 evidence gate tests."""
from __future__ import annotations
import importlib.util
import sys
from datetime import datetime, timezone
from pathlib import Path
import pytest

ROOT = Path(__file__).resolve().parents[2]
SCRIPT_DIR = ROOT / "scripts"


@pytest.fixture(scope="module")
def evidence_module():
    """Load gemini_evidence_verify module."""
    spec = importlib.util.spec_from_file_location(
        "gemini_evidence_verify", SCRIPT_DIR / "gemini_evidence_verify.py"
    )
    assert spec and spec.loader
    mod = importlib.util.module_from_spec(spec)
    sys.modules["gemini_evidence_verify"] = mod
    spec.loader.exec_module(mod)
    return mod


@pytest.fixture(scope="module")
def gate_module(evidence_module):  # noqa: ARG001 — load order dependency
    """Load gemini_review_gate module (depends on evidence_module being loaded first)."""
    _ = evidence_module  # ensure load order
    spec = importlib.util.spec_from_file_location(
        "gemini_review_gate", SCRIPT_DIR / "gemini_review_gate.py"
    )
    assert spec and spec.loader
    mod = importlib.util.module_from_spec(spec)
    sys.modules["gemini_review_gate"] = mod
    spec.loader.exec_module(mod)
    return mod


def iso_z(dt: datetime) -> str:
    return dt.astimezone(timezone.utc).isoformat().replace("+00:00", "Z")


# Backward-compat alias (test imports `_iso` from conftest)
_iso = iso_z  # noqa: F401 — exported helper used by test modules


@pytest.fixture
def mock_gh_api(evidence_module, monkeypatch):
    """Stub _gh_api / _fetch_* / audit で外部呼び出しをブロック.

    使用法:
        mock_gh_api(reviews=[], review_comments=[], issue_comments=[],
                    check_runs=[], head_sha_date=None)
    """
    def _setup(
        reviews: list[dict] | None = None,
        review_comments: list[dict] | None = None,
        issue_comments: list[dict] | None = None,
        check_runs: list[dict] | None = None,
        head_sha_date: str | None = None,
    ):
        monkeypatch.setattr(evidence_module, "_fetch_reviews", lambda *_a: reviews or [])
        monkeypatch.setattr(evidence_module, "_fetch_review_comments", lambda *_a: review_comments or [])
        monkeypatch.setattr(evidence_module, "_fetch_issue_comments", lambda *_a: issue_comments or [])
        monkeypatch.setattr(evidence_module, "_fetch_check_runs", lambda *_a: check_runs or [])
        # head pushed_at — 신규 함수 + 하위호환 alias 둘 다 stub
        monkeypatch.setattr(evidence_module, "_fetch_head_pushed_at", lambda *_a: head_sha_date)
        monkeypatch.setattr(evidence_module, "_fetch_head_sha_date", lambda *_a: head_sha_date)
        # audit 차단
        monkeypatch.setattr(evidence_module, "_append_audit", lambda *_a: None)
    return _setup


def make_review(body: str, commit_id: str, review_id: int = 1) -> dict:
    return {
        "id": review_id,
        "user": {"login": "gemini-code-assist[bot]"},
        "body": body,
        "commit_id": commit_id,
        "state": "COMMENTED",
    }


def make_review_comment(body: str, commit_id: str, comment_id: int = 100) -> dict:
    return {
        "id": comment_id,
        "user": {"login": "gemini-code-assist[bot]"},
        "body": body,
        "commit_id": commit_id,
    }


def make_issue_comment(body: str, comment_id: int = 200, created_at: str | None = None) -> dict:
    return {
        "id": comment_id,
        "user": {"login": "gemini-code-assist[bot]"},
        "body": body,
        "created_at": created_at,
    }


def make_check_run(name: str, conclusion: str = "success", run_id: int = 1000) -> dict:
    return {
        "id": run_id,
        "name": name,
        "status": "completed",
        "conclusion": conclusion,
        "app": {"slug": "gemini-code-assist"},
    }
