#!/usr/bin/env python3
"""
스펙 자동 추출 시스템

Usage:
    python3 memory/spec-extractor.py extract "대화 내용"
    python3 memory/spec-extractor.py from-file conversation.txt
"""

import json
import re
from dataclasses import asdict, dataclass
from typing import Dict, List


@dataclass
class ProjectSpec:
    """프로젝트 스펙"""

    name: str = ""
    description: str = ""
    frontend: str = ""
    backend: str = ""
    database: str = ""
    features: List[str] = None
    constraints: List[str] = None
    timeline: str = ""

    def __post_init__(self):
        if self.features is None:
            self.features = []
        if self.constraints is None:
            self.constraints = []


def extract_keywords(text: str) -> Dict[str, List[str]]:
    """텍스트에서 키워드 추출"""

    # 프론트엔드 키워드
    frontend_keywords = ["React", "Vue", "Angular", "프론트엔드", "frontend", "UI", "화면"]
    frontend_found = [kw for kw in frontend_keywords if kw.lower() in text.lower()]

    # 백엔드 키워드
    backend_keywords = ["FastAPI", "Django", "Node.js", "백엔드", "backend", "API", "서버"]
    backend_found = [kw for kw in backend_keywords if kw.lower() in text.lower()]

    # 데이터베이스 키워드
    db_keywords = ["PostgreSQL", "MySQL", "MongoDB", "DB", "데이터베이스"]
    db_found = [kw for kw in db_keywords if kw.lower() in text.lower()]

    return {"frontend": frontend_found, "backend": backend_found, "database": db_found}


def extract_features(text: str) -> List[str]:
    """기능 목록 추출"""

    features = []

    # 패턴 매칭
    patterns = [r"기능[:\s]+([^\n]+)", r"만들고 싶어[:\s]+([^\n]+)", r"구현[:\s]+([^\n]+)", r"필요[:\s]+([^\n]+)"]

    for pattern in patterns:
        matches = re.findall(pattern, text, re.IGNORECASE)
        features.extend(matches)

    # 키워드 기반 추출
    feature_keywords = ["로그인", "회원가입", "결제", "알림", "검색", "대시보드"]
    for kw in feature_keywords:
        if kw in text:
            features.append(kw)

    return list(set(features))


def extract_constraints(text: str) -> List[str]:
    """제약사항 추출"""

    constraints = []

    # 패턴 매칭
    patterns = [r"제약[:\s]+([^\n]+)", r"조건[:\s]+([^\n]+)", r"필수[:\s]+([^\n]+)", r"금지[:\s]+([^\n]+)"]

    for pattern in patterns:
        matches = re.findall(pattern, text, re.IGNORECASE)
        constraints.extend(matches)

    return list(set(constraints))


def extract_spec_from_conversation(conversation: str) -> ProjectSpec:
    """
    대화에서 스펙 자동 추출

    Args:
        conversation: 대화 텍스트

    Returns:
        ProjectSpec: 추출된 스펙
    """

    # 키워드 추출
    keywords = extract_keywords(conversation)

    # 기능 추출
    features = extract_features(conversation)

    # 제약사항 추출
    constraints = extract_constraints(conversation)

    # 프로젝트명 추출
    name_match = re.search(r"프로젝트[:\s]+([^\n]+)", conversation, re.IGNORECASE)
    project_name = name_match.group(1).strip() if name_match else "미정"

    # 스펙 생성
    spec = ProjectSpec(
        name=project_name,
        description=conversation[:200],  # 처음 200자
        frontend=keywords["frontend"][0] if keywords["frontend"] else "미정",
        backend=keywords["backend"][0] if keywords["backend"] else "미정",
        database=keywords["database"][0] if keywords["database"] else "미정",
        features=features,
        constraints=constraints,
    )

    return spec


def save_spec(spec: ProjectSpec, output_path: str = None) -> str:
    """스펙 저장"""

    if output_path is None:
        output_path = f"/home/jay/workspace/memory/specs/{spec.name}-spec.json"

    import os

    os.makedirs(os.path.dirname(output_path), exist_ok=True)

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

    return output_path


def main():
    """CLI 인터페이스"""
    import sys

    if len(sys.argv) < 2:
        print("Usage:")
        print("  python3 memory/spec-extractor.py extract '대화 내용'")
        print("  python3 memory/spec-extractor.py from-file conversation.txt")
        sys.exit(1)

    command = sys.argv[1]

    if command == "extract":
        if len(sys.argv) < 3:
            print("Error: 대화 내용을 입력하세요")
            sys.exit(1)

        conversation = sys.argv[2]
        spec = extract_spec_from_conversation(conversation)

        print(json.dumps(asdict(spec), ensure_ascii=False, indent=2))

    elif command == "from-file":
        if len(sys.argv) < 3:
            print("Error: 파일 경로를 입력하세요")
            sys.exit(1)

        file_path = sys.argv[2]
        with open(file_path, "r", encoding="utf-8") as f:
            conversation = f.read()

        spec = extract_spec_from_conversation(conversation)
        output_path = save_spec(spec)

        print(f"✅ 스펙 저장 완료: {output_path}")
        print(json.dumps(asdict(spec), ensure_ascii=False, indent=2))

    else:
        print(f"Unknown command: {command}")
        sys.exit(1)


if __name__ == "__main__":
    main()
