#!/bin/bash
# Skill 提炼辅助脚本
# 从一条 learning 中创建新的 skill
# 用法：./extract-skill.sh <skill-name> [--dry-run]

set -e

# 配置
SKILLS_DIR="./skills"

# 终端颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 恢复默认颜色

usage() {
    cat << EOF
用法：$(basename "$0") <skill-name> [options]

从一条 learning 中创建一个新的 skill。

参数：
  skill-name     skill 名称（仅小写，空格用连字符）

选项：
  --dry-run      仅展示将要创建的内容，不实际写文件
  --output-dir   当前路径下的相对输出目录（默认：./skills）
  -h, --help     显示帮助信息

示例：
  $(basename "$0") docker-m1-fixes
  $(basename "$0") api-timeout-patterns --dry-run
  $(basename "$0") pnpm-setup --output-dir ./skills/custom

skill 将创建在：\$SKILLS_DIR/<skill-name>/
EOF
}

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1" >&2
}

# 解析参数
SKILL_NAME=""
DRY_RUN=false

while [[ $# -gt 0 ]]; do
    case $1 in
        --dry-run)
            DRY_RUN=true
            shift
            ;;
        --output-dir)
            if [ -z "${2:-}" ] || [[ "${2:-}" == -* ]]; then
                log_error "--output-dir 需要一个相对路径参数"
                usage
                exit 1
            fi
            SKILLS_DIR="$2"
            shift 2
            ;;
        -h|--help)
            usage
            exit 0
            ;;
        -*)
            log_error "未知选项：$1"
            usage
            exit 1
            ;;
        *)
            if [ -z "$SKILL_NAME" ]; then
                SKILL_NAME="$1"
            else
                log_error "出现了不期望的参数：$1"
                usage
                exit 1
            fi
            shift
            ;;
    esac
done

# 校验 skill 名称
if [ -z "$SKILL_NAME" ]; then
    log_error "必须提供 skill 名称"
    usage
    exit 1
fi

# 校验 skill 名称格式（仅小写、连字符、无空格）
if ! [[ "$SKILL_NAME" =~ ^[a-z0-9]+(-[a-z0-9]+)*$ ]]; then
    log_error "skill 名称格式不合法。只能使用小写字母、数字和连字符。"
    log_error "示例：'docker-fixes'、'api-patterns'、'pnpm-setup'"
    exit 1
fi

# 校验输出路径，避免写到当前工作区之外
if [[ "$SKILLS_DIR" = /* ]]; then
    log_error "输出目录必须是当前目录下的相对路径。"
    exit 1
fi

if [[ "$SKILLS_DIR" =~ (^|/)\.\.(/|$) ]]; then
    log_error "输出目录不能包含 '..' 路径片段。"
    exit 1
fi

SKILLS_DIR="${SKILLS_DIR#./}"
SKILLS_DIR="./$SKILLS_DIR"

SKILL_PATH="$SKILLS_DIR/$SKILL_NAME"

# 检查 skill 是否已存在
if [ -d "$SKILL_PATH" ] && [ "$DRY_RUN" = false ]; then
    log_error "skill 已存在：$SKILL_PATH"
    log_error "请换一个名称，或先删除已有 skill。"
    exit 1
fi

# Dry run 输出
if [ "$DRY_RUN" = true ]; then
    log_info "Dry run，计划创建："
    echo "  $SKILL_PATH/"
    echo "  $SKILL_PATH/SKILL.md"
    echo ""
    echo "模板内容如下："
    echo "---"
    cat << TEMPLATE
name: $SKILL_NAME
description: "[TODO: 用简洁语言说明此 skill 的作用及适用场景]"
---

# $(echo "$SKILL_NAME" | sed 's/-/ /g' | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) tolower(substr($i,2))}1')

[TODO: 简要说明此 skill 的目标和用途]

## 快速参考

| 场景 | 动作 |
|-----------|--------|
| [触发条件] | [执行动作] |

## 用法

[TODO: 补充详细使用说明]

## 示例

[TODO: 添加具体示例]

## 来源 Learning

此 skill 由一条 learning 提炼而来。
- Learning ID: [TODO: 填写原始 learning ID]
- Original File: .learnings/LEARNINGS.md
TEMPLATE
    echo "---"
    exit 0
fi

# 创建 skill 目录结构
log_info "正在创建 skill：$SKILL_NAME"

mkdir -p "$SKILL_PATH"

# 根据模板创建 SKILL.md
cat > "$SKILL_PATH/SKILL.md" << TEMPLATE
---
name: $SKILL_NAME
description: "[TODO: 用简洁语言说明此 skill 的作用及适用场景]"
---

# $(echo "$SKILL_NAME" | sed 's/-/ /g' | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) tolower(substr($i,2))}1')

[TODO: 简要说明此 skill 的目标和用途]

## 快速参考

| 场景 | 动作 |
|-----------|--------|
| [触发条件] | [执行动作] |

## 用法

[TODO: 补充详细使用说明]

## 示例

[TODO: 添加具体示例]

## 来源 Learning

此 skill 由一条 learning 提炼而来。
- Learning ID: [TODO: 填写原始 learning ID]
- Original File: .learnings/LEARNINGS.md
TEMPLATE

log_info "已创建：$SKILL_PATH/SKILL.md"

# 给出下一步建议
echo ""
log_info "Skill 脚手架创建完成。"
echo ""
echo "后续建议："
echo "  1. 编辑 $SKILL_PATH/SKILL.md"
echo "  2. 用对应 learning 的内容填充 TODO 部分"
echo "  3. 如果有详细文档，补充 references/ 目录"
echo "  4. 如果有可执行代码，补充 scripts/ 目录"
echo "  5. 更新原始 learning 条目："
echo "     **Status**: promoted_to_skill"
echo "     **Skill-Path**: skills/$SKILL_NAME"
