"""capture.py - 스킬 실행 입력 자동 캡처 모듈.

스킬이 실행될 때 사용된 user_input을 자동으로 저장하여,
autoresearch 테스트 입력으로 활용한다.

저장 경로: skills/<skill_name>/evals/test-inputs.yaml

YAML 포맷:
    inputs:
      - id: input-20260326-143022
        text: "보험 FA 모집 광고, 타겟: 30대 보험설계사"
"""

from __future__ import annotations

import os
import warnings
from datetime import datetime
from pathlib import Path
from typing import Any

import yaml

_MAX_INPUTS = 20
_WORKSPACE_ROOT = os.environ.get(
    "WORKSPACE_ROOT", str(Path(__file__).resolve().parent.parent.parent)
)


def capture_input(
    skill_name: str,
    user_input: str,
    skills_dir: str = str(Path(_WORKSPACE_ROOT) / "skills"),
) -> None:
    """스킬 사용 입력을 test-inputs.yaml에 추가.

    - 중복 체크 (동일 텍스트 이미 있으면 스킵)
    - 최대 20개 유지 (오래된 것 FIFO 삭제)
    - id는 timestamp 기반 자동 생성 (예: "input-20260326-143022")

    Args:
        skill_name: 스킬 이름 (디렉토리 이름).
        user_input: 캡처할 사용자 입력 텍스트.
        skills_dir: 스킬 루트 디렉토리 경로.

    Returns:
        None (항상 None 반환; 예외 발생 시에도 raise하지 않음)
    """
    try:
        evals_dir = Path(skills_dir) / skill_name / "evals"
        evals_dir.mkdir(parents=True, exist_ok=True)

        yaml_path = evals_dir / "test-inputs.yaml"

        # 기존 데이터 로드
        inputs: list[dict[str, Any]] = []
        if yaml_path.exists():
            raw = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
            if isinstance(raw, dict) and isinstance(raw.get("inputs"), list):
                inputs = raw["inputs"]

        # 중복 체크: text 필드가 동일하면 스킵
        existing_texts = {entry.get("text", "") for entry in inputs}
        if user_input in existing_texts:
            return None

        # 새 항목 생성
        timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
        new_entry: dict[str, Any] = {
            "id": f"input-{timestamp}",
            "text": user_input,
        }

        # 리스트 끝에 추가
        inputs.append(new_entry)

        # FIFO: 20개 초과 시 앞에서부터 삭제
        if len(inputs) > _MAX_INPUTS:
            inputs = inputs[len(inputs) - _MAX_INPUTS :]

        # 저장
        data: dict[str, Any] = {"inputs": inputs}
        yaml_path.write_text(
            yaml.dump(data, allow_unicode=True, default_flow_style=False),
            encoding="utf-8",
        )

    except Exception as exc:  # noqa: BLE001
        warnings.warn(
            f"[capture_input] 입력 저장 실패 (skill={skill_name}): {exc}",
            stacklevel=2,
        )

    return None
