#!/bin/bash

# GGTGenCode - 模版代码生成工具
# 用法: gen_code -t <template_name> -n <new_project_name>

set -e

# 默认值
TEMPLATE=""
NEW_NAME=""
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TEMPLATES_DIR="$SCRIPT_DIR/templates"

# 显示帮助信息
show_help() {
    echo "GGTGenCode - 模版代码生成工具"
    echo ""
    echo "用法: gen_code -t <template_name> -n <new_project_name>"
    echo ""
    echo "选项:"
    echo "  -t, --template    指定模版名称 (qt, qtnativewebview)"
    echo "  -n, --name        指定新项目名称"
    echo "  -h, --help        显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  gen_code -t qtnativewebview -n MyApp"
    echo "  gen_code -t qt -n MyQtApp"
    echo ""
    echo "可用模版:"
    if [ -d "$TEMPLATES_DIR" ]; then
        for template in "$TEMPLATES_DIR"/*; do
            if [ -d "$template" ]; then
                echo "  - $(basename "$template")"
            fi
        done
    fi
}

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -t|--template)
            TEMPLATE="$2"
            shift 2
            ;;
        -n|--name)
            NEW_NAME="$2"
            shift 2
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            echo "错误: 未知参数 '$1'"
            echo "使用 'gen_code -h' 查看帮助信息"
            exit 1
            ;;
    esac
done

# 验证参数
if [ -z "$TEMPLATE" ]; then
    echo "错误: 请指定模版名称 (-t)"
    echo "使用 'gen_code -h' 查看帮助信息"
    exit 1
fi

if [ -z "$NEW_NAME" ]; then
    echo "错误: 请指定新项目名称 (-n)"
    echo "使用 'gen_code -h' 查看帮助信息"
    exit 1
fi

# 检查模版是否存在
TEMPLATE_PATH="$TEMPLATES_DIR/$TEMPLATE"
if [ ! -d "$TEMPLATE_PATH" ]; then
    echo "错误: 模版 '$TEMPLATE' 不存在"
    echo "可用模版:"
    for template in "$TEMPLATES_DIR"/*; do
        if [ -d "$template" ]; then
            echo "  - $(basename "$template")"
        fi
    done
    exit 1
fi

# 检查模版中的GGTPassword目录
SOURCE_DIR="$TEMPLATE_PATH/GGTPassword"
if [ ! -d "$SOURCE_DIR" ]; then
    echo "错误: 模版 '$TEMPLATE' 中没有找到 GGTPassword 目录"
    exit 1
fi

# 检查目标目录是否已存在
TARGET_DIR="$(pwd)/$NEW_NAME"
if [ -d "$TARGET_DIR" ]; then
    echo "错误: 目标目录 '$TARGET_DIR' 已存在"
    exit 1
fi

echo "开始生成项目..."
echo "模版: $TEMPLATE"
echo "新项目名称: $NEW_NAME"
echo "目标路径: $TARGET_DIR"
echo ""

# 复制模版目录
echo "正在复制模版文件..."
cp -r "$SOURCE_DIR" "$TARGET_DIR"

# 计算新项目名称的小写形式（用于替换小写版本）
NEW_NAME_LOWER=$(echo "$NEW_NAME" | tr '[:upper:]' '[:lower:]')

# 替换文件内容中的 GGTPassword
echo "正在替换文件内容..."

# 需要替换内容的文件类型
FILE_EXTENSIONS=("*.cpp" "*.h" "*.txt" "*.md" "*.sh" "*.js" "*.html" "*.plist" "*.in" "*.qrc" "*.conf" "*.mm" "*.bat" "*.xml" "*.java" "*.json")

# 遍历所有文件进行内容替换
for ext in "${FILE_EXTENSIONS[@]}"; do
    find "$TARGET_DIR" -name "$ext" -type f -print0 | while IFS= read -r -d '' file; do
        if [ -f "$file" ]; then
            # 使用LC_ALL=C来避免编码问题
            LC_ALL=C sed -i '' "s/GGTPassword/$NEW_NAME/g" "$file" 2>/dev/null || true
            # 同时替换小写的bundle identifier
            LC_ALL=C sed -i '' "s/ggtpassword/$NEW_NAME_LOWER/g" "$file" 2>/dev/null || true
        fi
    done
done

# 特殊处理：替换bundle identifier中的小写形式
# com.ggt.GGTPassword -> com.ggt.NewName
# com.joeyuan.ggtpassword -> com.joeyuan.newname (小写)
find "$TARGET_DIR" \( -name "*.plist*" -o -name "CMakeLists.txt" -o -name "*.xml" -o -name "*.json" \) -type f -print0 | while IFS= read -r -d '' file; do
    if [ -f "$file" ]; then
        LC_ALL=C sed -i '' "s/com\.ggt\.GGTPassword/com.ggt.$NEW_NAME/g" "$file" 2>/dev/null || true
        LC_ALL=C sed -i '' "s/com\.joeyuan\.ggtpassword/com.joeyuan.$NEW_NAME_LOWER/g" "$file" 2>/dev/null || true
    fi
done

# 重命名可能包含项目名的文件和目录
echo "正在检查需要重命名的文件和目录..."

# 先收集所有需要重命名的项目，避免在遍历过程中修改目录结构
rename_list=()

# 查找需要重命名的文件和目录（同时查找大写和小写版本）
while IFS= read -r -d '' item; do
    basename_item=$(basename "$item")
    if [[ "$basename_item" == *"GGTPassword"* ]] || [[ "$basename_item" == *"ggtpassword"* ]]; then
        rename_list+=("$item")
    fi
done < <(find "$TARGET_DIR" \( -name "*GGTPassword*" -o -name "*ggtpassword*" \) -print0)

# 按深度排序（深度大的先处理，避免父目录重命名后子项目路径失效）
IFS=$'\n' sorted_list=($(printf '%s\n' "${rename_list[@]}" | awk '{print length($0), $0}' | sort -nr | cut -d' ' -f2-))

# 执行重命名
for item in "${sorted_list[@]}"; do
    if [ -e "$item" ]; then  # 检查项目是否仍然存在
        parent=$(dirname "$item")
        basename=$(basename "$item")
        # 先替换大写版本，再替换小写版本
        new_basename=$(echo "$basename" | sed "s/GGTPassword/$NEW_NAME/g" | sed "s/ggtpassword/$NEW_NAME_LOWER/g")
        
        if [ "$basename" != "$new_basename" ]; then
            new_path="$parent/$new_basename"
            if [ -f "$item" ]; then
                echo "重命名文件: $basename -> $new_basename"
            else
                echo "重命名目录: $basename -> $new_basename"
            fi
            mv "$item" "$new_path" 2>/dev/null || echo "警告: 无法重命名 $item"
        fi
    fi
done

echo ""
echo "✅ 项目生成完成！"
echo "📁 项目路径: $TARGET_DIR"
echo ""
echo "接下来你可以："
echo "1. cd $NEW_NAME"
echo "2. 根据项目类型进行构建："
if [ "$TEMPLATE" = "qtnativewebview" ]; then
    echo "   - macOS: ./build.sh"
    echo "   - iOS: ./build_ios.sh"
elif [ "$TEMPLATE" = "qt" ]; then
    echo "   - mkdir build && cd build"
    echo "   - cmake .. && make"
fi
echo ""