"""ReferencePhase2Service 단위 테스트 — F24.4.3.

검증 대상:
1. `run()` 시그니처 — ctx 단일 인자 + None 반환 (void)
2. orchestrator `__init__`이 `_phase2_svc`로 Phase2Service를 주입
3. `_get_style_context` 로컬 메서드 시그니처 (F24.4.3에서 Phase2Service로 이관, F24.4.5에서 orchestrator 쪽은 삭제)
"""
from __future__ import annotations

import inspect
from unittest.mock import MagicMock

from app.services.reference_phase2_service import ReferencePhase2Service
from app.services.reference_pipeline_orchestrator import ReferencePipelineOrchestrator


# ──────────────────────────────────────────────────────────────────────
# 1) run 시그니처 — ctx 단일 인자 + None 반환
# ──────────────────────────────────────────────────────────────────────


def test_phase2_run_signature():
    sig = inspect.signature(ReferencePhase2Service.run)
    params = list(sig.parameters.keys())
    assert params == ["self", "ctx"]
    # `from __future__ import annotations`로 문자열 annotation 사용 → "None" 또는 비어있음
    assert sig.return_annotation in (None, "None", inspect.Signature.empty)


# ──────────────────────────────────────────────────────────────────────
# 2) _get_style_context 시그니처 — orchestrator와 동일 (episode_id Optional)
# ──────────────────────────────────────────────────────────────────────


def test_phase2_get_style_context_signature():
    sig = inspect.signature(ReferencePhase2Service._get_style_context)
    params = sig.parameters
    assert "episode_id" in params
    assert params["episode_id"].default is None


# ──────────────────────────────────────────────────────────────────────
# 3) orchestrator wiring — __init__이 ReferencePhase2Service를 주입
# ──────────────────────────────────────────────────────────────────────


def test_orchestrator_wires_phase2_service(monkeypatch):
    captured = {}

    class _Spy(ReferencePhase2Service):
        def __init__(self, *args, **kwargs):
            captured["kwargs"] = kwargs
            super().__init__(*args, **kwargs)

    monkeypatch.setattr(
        "app.services.reference_pipeline_orchestrator.ReferencePhase2Service",
        _Spy,
    )

    logger = MagicMock()
    orch = ReferencePipelineOrchestrator(
        db=MagicMock(), project_id="p1", actor_id="u1", activity_logger=logger,
    )
    assert isinstance(orch._phase2_svc, _Spy)
    assert isinstance(orch._phase2_svc, ReferencePhase2Service)
    assert captured["kwargs"]["project_id"] == "p1"
    assert captured["kwargs"]["actor_id"] == "u1"
    assert captured["kwargs"]["activity_logger"] is logger
