"""
API Security Review orchestrator for Gar
API/인터페이스 보안 취약점에 특화된 에이전트를 실행한다.
"""

from __future__ import annotations

from pathlib import Path
from typing import Iterable

from common.context import (
    ReviewConfig,
    ReviewContext,
    ReviewFinding,
    ReviewFlags,
    ReviewMode,
    ReviewReport,
    ReviewState,
    ReviewTarget,
)
from api_security.llm.client import LocalOpenAIAgentBackend
from api_security.reviewers.api_security.agent import ApiSecurityReviewAgent


class ReviewOrchestrator:
    """리뷰 모드에 따라 적절한 에이전트를 실행하는 오케스트레이터 (API 보안 모드 전용)."""

    def __init__(self, backend: LocalOpenAIAgentBackend | None = None, base_url: str | None = None) -> None:
        self._backend = backend or LocalOpenAIAgentBackend(base_url=base_url)

    def build_context(
        self,
        *,
        mode: ReviewMode,
        files: Iterable[str | Path],
        model: str,
        temperature: float = 0.2,
        max_output_tokens: int = 2048,
        max_retries: int = 3,
        language: str | None = "Korean",
        quiet: bool = False,
        show_prompt: bool = False,
        input_context: dict | None = None,
    ) -> ReviewContext:
        target_files = [Path(f).resolve() for f in files]
        config = ReviewConfig(
            model=model,
            temperature=temperature,
            max_output_tokens=max_output_tokens,
            max_retries=max_retries,
            language=language,
        )
        flags = ReviewFlags(quiet=quiet, show_prompt=show_prompt)
        target = ReviewTarget(files=target_files)
        state = ReviewState(input_context=input_context)
        return ReviewContext(mode=mode, config=config, flags=flags, target=target, state=state)

    def run(self, ctx: ReviewContext) -> ReviewReport:
        """컨텍스트에 따라 적절한 에이전트 실행."""

        if ctx.mode is ReviewMode.API_SECURITY:
            agent = ApiSecurityReviewAgent(self._backend)
            findings = agent.run(ctx)

            # 방어 로직: 빈 결과 방지
            if not findings:
                findings = [
                    ReviewFinding(
                        file=None,
                        line=None,
                        category="system",
                        severity="info",
                        message="API 보안 리뷰가 완료되었으나 발견된 문제가 없습니다.",
                    )
                ]

            return ReviewReport(mode=ctx.mode, findings=findings)

        # API 보안 오케스트레이터에서는 다른 모드는 안내 메시지로 처리
        return ReviewReport(
            mode=ctx.mode,
            findings=[
                ReviewFinding(
                    file=None,
                    line=None,
                    category="system",
                    severity="info",
                    message=f"{ctx.mode.value} 모드는 API 보안 오케스트레이터에서 지원되지 않습니다. 'api_security' 모드를 사용하세요.",
                )
            ],
        )

