#!/usr/bin/env python3
"""
add-team.py - 새 팀 추가 CLI 스크립트

Usage:
    python3 scripts/add-team.py --name "팀명" --type "수직조직|횡단조직" --lead "리더ID" [--status "active|planned"]
    python3 scripts/add-team.py --list
    python3 scripts/add-team.py --help

Features:
    - config/teams.json에서 팀 정보 읽기
    - 새 팀 추가 시 teams.json 자동 업데이트
    - 팀 디렉터리 자동 생성 (teams/<team_id>/)
    - 기본 설정 파일 생성 (README.md, .gitkeep)
"""

import argparse
import json
import os
import sys
from datetime import datetime
from pathlib import Path

# 기본 경로
WORKSPACE_ROOT = Path(__file__).parent.parent
CONFIG_FILE = WORKSPACE_ROOT / "config" / "teams.json"
TEAMS_DIR = WORKSPACE_ROOT / "teams"


def load_config() -> dict:
    """teams.json 로드"""
    if not CONFIG_FILE.exists():
        return {"version": "1.0", "teams": {}, "metadata": {}}

    with open(CONFIG_FILE, "r", encoding="utf-8") as f:
        return json.load(f)


def save_config(config: dict) -> None:
    """teams.json 저장"""
    config["updated"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    # 메타데이터 업데이트
    config["metadata"] = {
        "total_teams": len(config.get("teams", {})),
        "active_teams": sum(1 for t in config.get("teams", {}).values() if t.get("status") == "active"),
        "planned_teams": sum(1 for t in config.get("teams", {}).values() if t.get("status") == "planned"),
        "total_members": sum(len(t.get("members", [])) for t in config.get("teams", {}).values()),
    }

    CONFIG_FILE.parent.mkdir(parents=True, exist_ok=True)
    with open(CONFIG_FILE, "w", encoding="utf-8") as f:
        json.dump(config, f, ensure_ascii=False, indent=2)


def generate_team_id(name: str) -> str:
    """팀명으로부터 team_id 생성"""
    # 한글을 영문으로 변환하는 간단한 매핑
    korean_to_english = {
        "개발": "dev",
        "팀": "team",
        "센터": "center",
        "실": "office",
        "전략": "strategy",
        "마케팅": "marketing",
        "보험": "insurance",
        "디자인": "design",
        "레드": "red",
    }

    result = name.lower().replace(" ", "-")
    for kr, en in korean_to_english.items():
        result = result.replace(kr, en)

    # 특수문자 제거
    result = "".join(c for c in result if c.isalnum() or c == "-")
    return result


def create_team_directory(team_id: str, team_name: str) -> Path:
    """팀 디렉터리 생성"""
    team_dir = TEAMS_DIR / team_id
    team_dir.mkdir(parents=True, exist_ok=True)

    # README.md 생성
    readme_path = team_dir / "README.md"
    if not readme_path.exists():
        readme_content = f"""# {team_name}

## 개요

이 디렉터리는 {team_name}의 작업 공간입니다.

## 구조

- `src/` - 소스 코드
- `tests/` - 테스트 코드
- `docs/` - 문서

## 팀원

(팀원 목록을 여기에 추가하세요)

## 작업 가이드

1. 모든 코드는 테스트와 함께 제출하세요
2. 커밋 메시지는 명확하게 작성하세요
3. PR은 리뷰 후 머지하세요
"""
        readme_path.write_text(readme_content, encoding="utf-8")

    # 기본 디렉터리 생성
    (team_dir / "src").mkdir(exist_ok=True)
    (team_dir / "tests").mkdir(exist_ok=True)
    (team_dir / "docs").mkdir(exist_ok=True)
    (team_dir / "src" / ".gitkeep").touch()
    (team_dir / "tests" / ".gitkeep").touch()

    # ★ cp 금지, symlink만 — 2026-04-17 미팅 합의
    # QC 디렉토리 생성 및 shared 심볼릭 링크 설정
    qc_dir = team_dir / "qc"
    qc_dir.mkdir(exist_ok=True)

    shared_verifiers = Path("../../shared/verifiers")
    verifiers_link = qc_dir / "verifiers"
    if not (verifiers_link.is_symlink() or verifiers_link.exists()):
        os.symlink(str(shared_verifiers), str(verifiers_link))

    shared_qc_verify = WORKSPACE_ROOT / "teams" / "shared" / "qc_verify.py"
    qc_verify_link = qc_dir / "qc_verify.py"
    if not (qc_verify_link.is_symlink() or qc_verify_link.exists()) and shared_qc_verify.exists():
        os.symlink(str(shared_qc_verify), str(qc_verify_link))

    return team_dir


def add_team(name: str, team_type: str, lead: str = None, status: str = "planned", members: list = None) -> dict:
    """새 팀 추가"""
    config = load_config()

    # team_id 생성
    team_id = generate_team_id(name)

    # 중복 확인
    if team_id in config.get("teams", {}):
        print(f"❌ 오류: 이미 존재하는 팀 ID입니다: {team_id}")
        sys.exit(1)

    # 팀 정보 생성
    team_info = {
        "name": name,
        "type": team_type,
        "status": status,
        "lead": lead,
        "members": members or [],
        "created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
    }

    # config에 추가
    if "teams" not in config:
        config["teams"] = {}
    config["teams"][team_id] = team_info

    # 저장
    save_config(config)

    # 팀 디렉터리 생성
    team_dir = create_team_directory(team_id, name)

    return {"team_id": team_id, "team_info": team_info, "directory": str(team_dir)}


def list_teams() -> None:
    """모든 팀 목록 출력"""
    config = load_config()
    teams = config.get("teams", {})

    if not teams:
        print("등록된 팀이 없습니다.")
        return

    print("\n📋 팀 목록")
    print("=" * 60)

    for team_id, info in teams.items():
        status_emoji = "🟢" if info.get("status") == "active" else "🟡"
        lead = info.get("lead", "-")
        members_count = len(info.get("members", []))

        print(f"{status_emoji} {team_id}")
        print(f"   이름: {info.get('name', '-')}")
        print(f"   유형: {info.get('type', '-')}")
        print(f"   리더: {lead}")
        print(f"   팀원: {members_count}명")
        print()

    # 메타데이터
    metadata = config.get("metadata", {})
    print("=" * 60)
    print(f"총 {metadata.get('total_teams', 0)}개 팀")
    print(f"활성: {metadata.get('active_teams', 0)}개 | 계획: {metadata.get('planned_teams', 0)}개")


def main():
    parser = argparse.ArgumentParser(
        description="새 팀 추가 CLI 스크립트",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
예시:
  python3 scripts/add-team.py --name "AI팀" --type "수직조직" --lead "gpt" --status "active"
  python3 scripts/add-team.py --list
        """,
    )

    parser.add_argument("--name", "-n", help="팀 이름")
    parser.add_argument("--type", "-t", choices=["수직조직", "횡단조직"], help="팀 유형")
    parser.add_argument("--lead", "-l", default=None, help="팀 리더 ID")
    parser.add_argument("--status", "-s", choices=["active", "planned"], default="planned", help="팀 상태")
    parser.add_argument("--members", "-m", nargs="+", default=[], help="팀원 ID 목록")
    parser.add_argument("--list", action="store_true", help="팀 목록 출력")

    args = parser.parse_args()

    if args.list:
        list_teams()
        return

    if not args.name or not args.type:
        parser.print_help()
        print("\n❌ 오류: --name과 --type은 필수입니다")
        sys.exit(1)

    # 팀 추가
    result = add_team(name=args.name, team_type=args.type, lead=args.lead, status=args.status, members=args.members)

    print("✅ 팀 추가 완료!")
    print(f"   팀 ID: {result['team_id']}")
    print(f"   팀명: {result['team_info']['name']}")
    print(f"   유형: {result['team_info']['type']}")
    print(f"   상태: {result['team_info']['status']}")
    print(f"   리더: {result['team_info']['lead'] or '-'}")
    print(f"   디렉터리: {result['directory']}")


if __name__ == "__main__":
    main()
