#!/usr/bin/env python3
"""
대화 감지 → 스펙 자동 추출 시스템

제이회장님과의 대화에서 프로젝트 요청을 감지하면
자동으로 spec-extractor.py를 호출하여 스펙 문서 생성
"""

import json
import re
from datetime import datetime
from pathlib import Path
from typing import Dict, List, Optional


class ConversationSpecWatcher:
    """대화 감지 스펙 자동 추출기"""

    def __init__(self):
        self.workspace_path = Path("/home/jay/workspace")
        self.specs_dir = self.workspace_path / "memory" / "specs"
        self.specs_dir.mkdir(exist_ok=True)

        # 프로젝트 요청 감지 패턴
        self.project_patterns = [
            r"(.+)만들고 싶어",
            r"(.+)개발하고 싶어",
            r"(.+)구현하고 싶어",
            r"(.+)서비스를 만들고 싶어",
            r"(.+)프로그램을 만들고 싶어",
            r"(.+)플랫폼을 만들고 싶어",
        ]

    def detect_project_request(self, message: str) -> Optional[Dict]:
        """대화에서 프로젝트 요청 감지"""

        for pattern in self.project_patterns:
            match = re.search(pattern, message)
            if match:
                project_desc = match.group(1).strip()
                return {
                    "detected": True,
                    "project_description": project_desc,
                    "original_message": message,
                    "timestamp": datetime.now().isoformat(),
                }

        return None

    def extract_spec(self, project_desc: str) -> Dict:
        """spec-extractor.py 호출하여 스펙 추출"""

        import subprocess

        # spec-extractor.py 호출
        result = subprocess.run(
            ["python3", "memory/spec-extractor.py", "extract", project_desc],
            capture_output=True,
            text=True,
            cwd=str(self.workspace_path),
        )

        if result.returncode == 0:
            try:
                return json.loads(result.stdout)
            except:
                return {"status": "error", "message": "스펙 추출 실패", "output": result.stdout}
        else:
            return {"status": "error", "message": result.stderr}

    def save_spec(self, spec: Dict, project_name: str) -> str:
        """스펙 문서 저장"""

        timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
        spec_file = self.specs_dir / f"{project_name}-{timestamp}.json"

        with open(spec_file, "w", encoding="utf-8") as f:
            json.dump(spec, f, ensure_ascii=False, indent=2)

        return str(spec_file)

    def process_message(self, message: str) -> Optional[Dict]:
        """메시지 처리 (진입점)"""

        # 프로젝트 요청 감지
        detection = self.detect_project_request(message)

        if not detection or not detection["detected"]:
            return None

        # 스펙 추출
        spec = self.extract_spec(detection["project_description"])

        # 저장
        if spec.get("status") != "error":
            project_name = spec.get("project", {}).get("name", "unknown")
            spec_file = self.save_spec(spec, project_name)

            return {"status": "success", "project_name": project_name, "spec_file": spec_file, "spec": spec}

        return spec


def main():
    import sys

    watcher = ConversationSpecWatcher()

    if len(sys.argv) > 1:
        message = " ".join(sys.argv[1:])
        result = watcher.process_message(message)

        if result:
            print(json.dumps(result, ensure_ascii=False, indent=2))
        else:
            print(json.dumps({"status": "no_project_detected"}))
    else:
        print("사용법:")
        print("  python3 memory/conversation-spec-watcher.py <메시지>")
        print("\n예시:")
        print("  python3 memory/conversation-spec-watcher.py '쇼핑몰 만들고 싶어'")


if __name__ == "__main__":
    main()
