#!/usr/bin/env python3
"""
Boris Workflow 자동화 시스템
Research → Plan → Annotate → Todo → Implement → Feedback
6개 파일 자동 생성 + "don't implement yet" 가드
"""

import os
import sys
from datetime import datetime
from pathlib import Path
from typing import Dict, List, Optional

import yaml


class BorisWorkflowEngine:
    """Boris Workflow 자동화 엔진"""

    def __init__(self, memory_path: str = None):
        """초기화"""
        if memory_path is None:
            memory_path = Path(__file__).parent
        self.memory_path = Path(memory_path)
        self.projects_path = self.memory_path / "projects"

        # search.py의 MemorySearchEngine import
        sys.path.insert(0, str(self.memory_path))
        from search import MemorySearchEngine

        self.search_engine = MemorySearchEngine(memory_path)

    def _generate_workflow_id(self, task_name: str, date: str) -> str:
        """
        Workflow ID 생성

        Args:
            task_name: 작업명
            date: 날짜 (YYYY-MM-DD)

        Returns:
            Workflow ID
        """
        slug = task_name.lower().replace(" ", "-")
        slug = "".join(c for c in slug if c.isalnum() or c == "-")
        return f"{date}-{slug}-workflow"

    def _create_research_file(self, task_name: str, workflow_id: str, date: str, output_dir: Path) -> Path:
        """
        research.md 파일 생성

        Args:
            task_name: 작업명
            workflow_id: Workflow ID
            date: 날짜
            output_dir: 출력 디렉토리

        Returns:
            생성된 파일 경로
        """
        content = f"""---
id: {workflow_id}-research
date: {date}
type: boris-workflow-research
task: {task_name}
workflow_id: {workflow_id}
status: in-progress
---

# Research: {task_name}

## 📋 목표
이 코드베이스/문제를 깊이 이해하고, 모든 세부사항을 파악한다.

---

## 🔍 리서치 내용

### 1. 개요
(여기에 전반적인 개요 작성)

### 2. 핵심 발견사항
- [발견 1]
- [발견 2]
- [발견 3]

### 3. 세부 분석

#### 3.1 [항목 1]
(상세 내용)

#### 3.2 [항목 2]
(상세 내용)

### 4. 잠재적 문제점
- [문제 1]
- [문제 2]

### 5. 기회 요인
- [기회 1]
- [기회 2]

---

## 📝 요약
(전체 리서치 요약)

---

## 다음 단계
- [ ] plan.md 작성
- [ ] 제이회장님 검토

---
**작성자:** 개발팀장 (GLM-5)
**작성일:** {date}
**Boris Workflow Phase:** Research
"""
        file_path = output_dir / f"{task_name.lower().replace(' ', '-')}-research.md"
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(content)
        return file_path

    def _create_plan_file(self, task_name: str, workflow_id: str, date: str, output_dir: Path) -> Path:
        """
        plan.md 파일 생성

        Args:
            task_name: 작업명
            workflow_id: Workflow ID
            date: 날짜
            output_dir: 출력 디렉토리

        Returns:
            생성된 파일 경로
        """
        content = f"""---
id: {workflow_id}-plan
date: {date}
type: boris-workflow-plan
task: {task_name}
workflow_id: {workflow_id}
status: in-progress
annotation_cycle: 0
---

# Plan: {task_name}

## 📋 구현 목표
(여기에 구현 목표 작성)

---

## 🎯 구현 방법

### 1. 아키텍처
(아키텍처 설명)

### 2. 기술 스택
- [기술 1]
- [기술 2]

### 3. 구현 단계

#### Phase 1: [단계명]
- [ ] [작업 1]
- [ ] [작업 2]

#### Phase 2: [단계명]
- [ ] [작업 1]
- [ ] [작업 2]

### 4. 코드 스니펫

```python
# 예시 코드
```

---

## ⚠️ 주의사항
- [주의 1]
- [주의 2]

---

## 🚫 DON'T IMPLEMENT YET
**이 계획은 아직 승인되지 않았습니다.**
**제이회장님의 검토와 승인이 필요합니다.**

---

## Annotation Cycle
**현재:** 0회
**최대:** 6회

### 제이회장님 메모
(여기에 메모를 추가하세요)

---
**작성자:** 개발팀장 (GLM-5)
**작성일:** {date}
**Boris Workflow Phase:** Plan
**⚠️ 구현 금지:** 승인 전까지 코드 작성 금지
"""
        file_path = output_dir / f"{task_name.lower().replace(' ', '-')}-plan.md"
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(content)
        return file_path

    def _create_annotated_file(self, task_name: str, workflow_id: str, date: str, output_dir: Path) -> Path:
        """
        annotated.md 파일 생성

        Args:
            task_name: 작업명
            workflow_id: Workflow ID
            date: 날짜
            output_dir: 출력 디렉토리

        Returns:
            생성된 파일 경로
        """
        content = f"""---
id: {workflow_id}-annotated
date: {date}
type: boris-workflow-annotated
task: {task_name}
workflow_id: {workflow_id}
status: in-progress
annotation_cycle: 1
---

# Annotated Plan: {task_name}

## 📋 제이회장님 피드백 반영

**Annotation Cycle:** 1/6

---

## 🔄 변경사항

### 1. [변경 항목 1]
**원본:** (plan.md 내용)
**수정:** (제이회장님 메모 반영)
**이유:** (수정 이유)

### 2. [변경 항목 2]
**원본:** (plan.md 내용)
**수정:** (제이회장님 메모 반영)
**이유:** (수정 이유)

---

## 📝 수정된 계획

(수정된 전체 계획)

---

## ⚠️ 추가 주의사항
- [새로운 주의 1]
- [새로운 주의 2]

---

## 🚫 DON'T IMPLEMENT YET
**이 계획은 아직 승인되지 않았습니다.**
**Annotation Cycle 진행 중입니다.**

---

## Annotation Cycle
**현재:** 1회
**최대:** 6회
**상태:** 진행 중

### 다음 단계
- [ ] 제이회장님 추가 메모 확인
- [ ] annotation_cycle 2 진행 (필요시)
- [ ] 또는 todo.md 작성 (승인 시)

---
**작성자:** 개발팀장 (GLM-5)
**작성일:** {date}
**Boris Workflow Phase:** Annotate
**⚠️ 구현 금지:** 승인 전까지 코드 작성 금지
"""
        file_path = output_dir / f"{task_name.lower().replace(' ', '-')}-annotated.md"
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(content)
        return file_path

    def _create_todo_file(self, task_name: str, workflow_id: str, date: str, output_dir: Path) -> Path:
        """
        todo.md 파일 생성

        Args:
            task_name: 작업명
            workflow_id: Workflow ID
            date: 날짜
            output_dir: 출력 디렉토리

        Returns:
            생성된 파일 경로
        """
        content = f"""---
id: {workflow_id}-todo
date: {date}
type: boris-workflow-todo
task: {task_name}
workflow_id: {workflow_id}
status: approved
---

# Todo: {task_name}

## ✅ 승인 완료
**제이회장님이 계획을 승인했습니다.**
**이제 구현을 시작할 수 있습니다.**

---

## 📋 작업 목록

### Phase 1: [단계명]
- [ ] [작업 1]
  - 예상 시간: [시간]
  - 담당: [팀원]
- [ ] [작업 2]
  - 예상 시간: [시간]
  - 담당: [팀원]

### Phase 2: [단계명]
- [ ] [작업 1]
- [ ] [작업 2]

### Phase 3: [단계명]
- [ ] [작업 1]
- [ ] [작업 2]

---

## 📊 진행 상황

**전체:** 0%
**완료:** 0개
**진행 중:** 0개
**대기:** [총 작업 수]개

---

## ⚠️ 구현 원칙
1. **지루해야 한다:** 기계적 실행
2. **중단 금지:** 모든 작업 완료까지 진행
3. **불필요한 주석 금지:** 깔끔한 코드
4. **any/unknown 타입 금지:** 엄격한 타이핑
5. **지속적 타입체크:** 문제 조기 발견

---

## 다음 단계
- [ ] implementation.md 작성
- [ ] 코드 구현 시작

---
**작성자:** 개발팀장 (GLM-5)
**작성일:** {date}
**Boris Workflow Phase:** Todo
**✅ 승인됨:** 구현 시작 가능
"""
        file_path = output_dir / f"{task_name.lower().replace(' ', '-')}-todo.md"
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(content)
        return file_path

    def _create_implementation_file(self, task_name: str, workflow_id: str, date: str, output_dir: Path) -> Path:
        """
        implementation.md 파일 생성

        Args:
            task_name: 작업명
            workflow_id: Workflow ID
            date: 날짜
            output_dir: 출력 디렉토리

        Returns:
            생성된 파일 경로
        """
        content = f"""---
id: {workflow_id}-implementation
date: {date}
type: boris-workflow-implementation
task: {task_name}
workflow_id: {workflow_id}
status: in-progress
---

# Implementation: {task_name}

## 🚀 구현 시작
**"implement it all"**

---

## 📝 구현 로그

### [날짜/시간] - [작업 내용]
```
(구현 내용 또는 코드)
```

### [날짜/시간] - [작업 내용]
```
(구현 내용 또는 코드)
```

---

## ✅ 완료된 작업
- [x] [작업 1]
- [x] [작업 2]

## 🔄 진행 중인 작업
- [ ] [작업 3]

## 📋 대기 중인 작업
- [ ] [작업 4]
- [ ] [작업 5]

---

## 🐛 발견된 문제
- [문제 1] - 해결됨/진행 중
- [문제 2] - 해결됨/진행 중

---

## 📊 진행 상황

**전체:** 0%
**완료:** 0개
**진행 중:** 0개
**대기:** [총 작업 수]개

---

## 다음 단계
- [ ] 모든 작업 완료
- [ ] feedback.md 작성

---
**작성자:** 개발팀장 (GLM-5)
**작성일:** {date}
**Boris Workflow Phase:** Implementation
**원칙:** 지루해야 한다 (기계적 실행)
"""
        file_path = output_dir / f"{task_name.lower().replace(' ', '-')}-implementation.md"
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(content)
        return file_path

    def _create_feedback_file(self, task_name: str, workflow_id: str, date: str, output_dir: Path) -> Path:
        """
        feedback.md 파일 생성

        Args:
            task_name: 작업명
            workflow_id: Workflow ID
            date: 날짜
            output_dir: 출력 디렉토리

        Returns:
            생성된 파일 경로
        """
        content = f"""---
id: {workflow_id}-feedback
date: {date}
type: boris-workflow-feedback
task: {task_name}
workflow_id: {workflow_id}
status: completed
---

# Feedback: {task_name}

## ✅ 완료 보고

**작업:** {task_name}
**상태:** 완료
**날짜:** {date}

---

## 📊 결과 요약

### 완료된 기능
- [기능 1]
- [기능 2]
- [기능 3]

### 성능 지표
- 속도: [측정값]
- 메모리: [측정값]
- 기타: [측정값]

---

## 🧪 테스트 결과

### 단위 테스트
- 커버리지: X%
- 통과: X개
- 실패: X개

### 통합 테스트
- [결과]

### E2E 테스트
- [결과]

---

## 📝 배운 점

### 잘한 점
- [성공 요인 1]
- [성공 요인 2]

### 개선할 점
- [개선점 1]
- [개선점 2]

### 다음에 적용할 것
- [교훈 1]
- [교훈 2]

---

## 🐛 발견된 버그
- [버그 1] - 수정됨/보류
- [버그 2] - 수정됨/보류

---

## 📋 향후 작업
- [ ] [작업 1]
- [ ] [작업 2]

---

## 🎯 제이회장님께

**완료 보고:**
(제이회장님에게 전달할 메시지)

---

**작성자:** 개발팀장 (GLM-5)
**작성일:** {date}
**Boris Workflow Phase:** Feedback
**상태:** 완료 ✅
"""
        file_path = output_dir / f"{task_name.lower().replace(' ', '-')}-feedback.md"
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(content)
        return file_path

    def create_workflow(self, task_name: str, project_name: str = None, date: str = None) -> Dict[str, str]:
        """
        Boris Workflow 6개 파일 생성

        Args:
            task_name: 작업명
            project_name: 프로젝트명 (선택적)
            date: 날짜 (YYYY-MM-DD), 없으면 오늘

        Returns:
            생성된 파일 경로 딕셔너리
        """
        # 날짜 설정
        if date is None:
            date = datetime.now().strftime("%Y-%m-%d")

        # Workflow ID 생성
        workflow_id = self._generate_workflow_id(task_name, date)

        # 출력 디렉토리 설정
        if project_name:
            output_dir = self.projects_path / project_name.lower().replace(" ", "-") / "workflows" / workflow_id
        else:
            output_dir = self.memory_path / "workflows" / workflow_id

        output_dir.mkdir(parents=True, exist_ok=True)

        print(f"📁 Workflow 디렉토리: {output_dir}")
        print(f"🆔 Workflow ID: {workflow_id}")

        # 6개 파일 생성
        files = {}

        print("\n📝 6개 파일 생성 중...")

        files["research"] = self._create_research_file(task_name, workflow_id, date, output_dir)
        print(f"  ✅ research.md")

        files["plan"] = self._create_plan_file(task_name, workflow_id, date, output_dir)
        print(f"  ✅ plan.md")

        files["annotated"] = self._create_annotated_file(task_name, workflow_id, date, output_dir)
        print(f"  ✅ annotated.md")

        files["todo"] = self._create_todo_file(task_name, workflow_id, date, output_dir)
        print(f"  ✅ todo.md")

        files["implementation"] = self._create_implementation_file(task_name, workflow_id, date, output_dir)
        print(f"  ✅ implementation.md")

        files["feedback"] = self._create_feedback_file(task_name, workflow_id, date, output_dir)
        print(f"  ✅ feedback.md")

        print(f"\n✅ Boris Workflow 생성 완료!")
        print(f"⚠️ 주의: plan.md에 'DON'T IMPLEMENT YET' 가드가 있습니다.")
        print(f"⚠️ 제이회장님의 승인 없이 구현 단계로 진입 금지.")

        return files


# 사용 예시 (테스트용)
if __name__ == "__main__":
    engine = BorisWorkflowEngine()

    print("=" * 60)
    print("🔄 Boris Workflow 자동화 테스트")
    print("=" * 60)

    # 테스트: InsuWiki Phase 2
    result = engine.create_workflow(task_name="InsuWiki Phase 2 Wiki CRUD", project_name="InsuWiki")

    print("\n" + "=" * 60)
    print("✅ Boris Workflow 준비 완료")
    print("=" * 60)
