#!/bin/bash

set -e

# 显示帮助信息
show_help() {
  cat << EOF
用法: $0 [选项]

选项:
    -z, --zip FILE        指定编译 modules 时的 Managed.zip 文件路径 (编译 modules 时必需)
    -m, --modules         只编译 modules
    -l, --launcher        只编译 launcher
    -a, --all             编译 modules 和 launcher (默认)
    -o, --output DIR      指定输出目录 (默认: ./build-output)
    -c, --compress        压缩输出为 7z 文件
    -h, --help            显示此帮助信息

示例:
    $0 -z ./Managed.zip -a -c                  # 编译全部并压缩
    $0 -z ./Managed.zip -m -c                  # 只编译 modules 并压缩
    $0 -l -c                                 # 只编译 launcher 并压缩
EOF
}

# 解析命令行参数
MANAGED_ZIP_FILE=""
BUILD_MODULES=false
BUILD_LAUNCHER=false
BUILD_ALL=true
OUTPUT_DIR="./build-output"
COMPRESS=false

while [[ $# -gt 0 ]]; do
  case $1 in
  -z|--zip)
    MANAGED_ZIP_FILE="$2"
    shift 2
    ;;
  -m|--modules)
    BUILD_MODULES=true
    BUILD_ALL=false
    shift
    ;;
  -l|--launcher)
    BUILD_LAUNCHER=true
    BUILD_ALL=false
    shift
    ;;
  -a|--all)
    BUILD_MODULES=true
    BUILD_LAUNCHER=true
    BUILD_ALL=true
    shift
    ;;
  -o|--output)
    OUTPUT_DIR="$2"
    shift 2
    ;;
  -c|--compress)
    COMPRESS=true
    shift
    ;;
  -h|--help)
    show_help
    exit 0
    ;;
  *)
    echo "未知参数: $1"
    show_help
    exit 1
    ;;
  esac
done

# 如果指定了 --all，则编译两者
if [ "$BUILD_ALL" = true ]; then
  BUILD_MODULES=true
  BUILD_LAUNCHER=true
fi

# 参数验证
if [ "$BUILD_MODULES" = true ] && [ -z "$MANAGED_ZIP_FILE" ]; then
  echo "错误: 编译 modules 需要指定 zip 文件，使用 -z 参数"
  exit 1
fi

if [ "$BUILD_MODULES" = true ] && [ ! -f "$MANAGED_ZIP_FILE" ]; then
  echo "错误: 找不到 zip 文件: $MANAGED_ZIP_FILE"
  exit 1
fi

# 自动获取版本信息
echo "正在获取版本信息..."
DATE_TIME=$(date +%Y%m%d)
SPT_SERVER_REPOSITORY="sp-tarkov/server-csharp"
SPT_SERVER_BRANCH="develop"
SPT_MODULES_REPOSITORY="sp-tarkov/modules"
SPT_MODULES_BRANCH="master"
SPT_LAUNCHER_REPOSITORY="sp-tarkov/launcher"
SPT_LAUNCHER_BRANCH="master"
SPT_BUILD_BRANCH="main"

# 获取 SPT 版本
SPT_VERSION=$(git ls-remote --tags "https://github.com/$SPT_SERVER_REPOSITORY.git" | awk -F'/' '{print $NF}' | grep -v '\^{}' | sort -V | tail -1)
SPT_VERSION=$(echo "$SPT_VERSION" | cut -d'-' -f1)
echo "SPT 版本: $SPT_VERSION"

# 获取客户端版本
CLIENT_VERSION=$(wget -qO- "https://raw.githubusercontent.com/$SPT_SERVER_REPOSITORY/refs/heads/$SPT_SERVER_BRANCH/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/core.json" | jq -r '.compatibleTarkovVersion')
echo "客户端版本: $CLIENT_VERSION"

# 获取 Modules Commit ID
MODULES_COMMIT_ID=$(git ls-remote "https://github.com/$SPT_MODULES_REPOSITORY.git" "refs/heads/$SPT_MODULES_BRANCH" | awk '{print $1}')
MODULES_COMMIT_ID=${MODULES_COMMIT_ID:0:8}
echo "Modules Commit: $MODULES_COMMIT_ID"

# 获取 Launcher Commit ID
LAUNCHER_COMMIT_ID=$(git ls-remote "https://github.com/$SPT_LAUNCHER_REPOSITORY.git" "refs/heads/$SPT_LAUNCHER_BRANCH" | awk '{print $1}')
LAUNCHER_COMMIT_ID=${LAUNCHER_COMMIT_ID:0:8}
echo "Launcher Commit: $LAUNCHER_COMMIT_ID"

# 生成压缩文件名
if [ "$BUILD_ALL" = true ]; then
  ARCHIVE_NAME="SPT-Launcher-${SPT_VERSION}-$DATE_TIME-${CLIENT_VERSION}-L${LAUNCHER_COMMIT_ID}-M${MODULES_COMMIT_ID}.zip"
else
  if [ "$BUILD_MODULES" = true ]; then
    ARCHIVE_NAME="SPT-Modules-${SPT_VERSION}-$DATE_TIME-${CLIENT_VERSION}-${MODULES_COMMIT_ID}.zip"
  else
    ARCHIVE_NAME="SPT-Launcher-${SPT_VERSION}-$DATE_TIME-${CLIENT_VERSION}-${LAUNCHER_COMMIT_ID}.zip"
  fi
fi

# 显示构建信息
echo ""
echo "=== SPT 自动构建 ==="
echo "构建时间: $DATE_TIME"
echo "输出目录: $OUTPUT_DIR"
[ "$COMPRESS" = true ] && echo "压缩文件: $ARCHIVE_NAME"
[ "$BUILD_MODULES" = true ] && echo "编译: Modules ✓"
[ "$BUILD_LAUNCHER" = true ] && echo "编译: Launcher ✓"
echo "版本信息: SPT $SPT_VERSION, 客户端 $CLIENT_VERSION"
echo "=================="

# 清理和准备目录
rm -rf "$OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR"

# 构建 Docker 命令
DOCKER_CMD="docker run --rm"

# 添加必要的卷挂载
DOCKER_CMD="$DOCKER_CMD -v \"$(pwd)/$OUTPUT_DIR:/tmp/build/output\""
DOCKER_CMD="$DOCKER_CMD -v \"./build.sh:/build.sh:ro\""
DOCKER_CMD="$DOCKER_CMD -v \"./bin/zip:/usr/bin/zip:ro\""
DOCKER_CMD="$DOCKER_CMD -v \"./bin/unzip:/usr/bin/unzip:ro\""

# 只有编译 modules 时才挂载 Managed.zip
if [ "$BUILD_MODULES" = true ] && [ -n "$MANAGED_ZIP_FILE" ] && [ -f "$MANAGED_ZIP_FILE" ]; then
  MANAGED_ZIP_PATH=$(realpath "$MANAGED_ZIP_FILE")
  DOCKER_CMD="$DOCKER_CMD -v \"$MANAGED_ZIP_PATH:/Managed.zip:ro\""
  # 传递实际的文件路径给构建脚本
  MANAGED_ZIP_ARG="/Managed.zip"
else
  # 如果不编译 modules，传递空字符串
  MANAGED_ZIP_ARG=""
fi

# zip和unzip权限设置为可执行
chmod a+x bin/*

# 添加容器镜像和构建脚本
DOCKER_CMD="$DOCKER_CMD refringe/spt-build-dotnet:2.1.0"
DOCKER_CMD="$DOCKER_CMD /build.sh"
DOCKER_CMD="$DOCKER_CMD \"$DATE_TIME\""
DOCKER_CMD="$DOCKER_CMD \"$SPT_VERSION\""
DOCKER_CMD="$DOCKER_CMD \"$CLIENT_VERSION\""
DOCKER_CMD="$DOCKER_CMD \"$MODULES_COMMIT_ID\""
DOCKER_CMD="$DOCKER_CMD \"$LAUNCHER_COMMIT_ID\""
DOCKER_CMD="$DOCKER_CMD \"$BUILD_MODULES\""
DOCKER_CMD="$DOCKER_CMD \"$BUILD_LAUNCHER\""
DOCKER_CMD="$DOCKER_CMD \"$COMPRESS\""
DOCKER_CMD="$DOCKER_CMD \"$ARCHIVE_NAME\""
DOCKER_CMD="$DOCKER_CMD \"$MANAGED_ZIP_ARG\""
DOCKER_CMD="$DOCKER_CMD \"$SPT_MODULES_BRANCH\""
DOCKER_CMD="$DOCKER_CMD \"$SPT_LAUNCHER_BRANCH\""
DOCKER_CMD="$DOCKER_CMD \"$SPT_BUILD_BRANCH\""

# 执行 Docker 命令
echo "执行命令: $DOCKER_CMD"
eval $DOCKER_CMD

# 最终脚本示例
#docker run --rm \
#  -v "$(pwd)/$OUTPUT_DIR:/tmp/build/output" \
#  -v "$(realpath $MANAGED_ZIP_FILE):/Managed.zip:ro" \
#  -v "./build.sh:/build.sh:ro" \
#  -v "./bin/zip:/usr/bin/zip:ro" \
#  -v "./bin/unzip:/usr/bin/unzip:ro" \
#  refringe/spt-build-dotnet:2.1.0 \
#  /build.sh \
#  "$DATE_TIME" \
#  "$SPT_VERSION" \
#  "$CLIENT_VERSION" \
#  "$MODULES_COMMIT_ID" \
#  "$LAUNCHER_COMMIT_ID" \
#  "$BUILD_MODULES" \
#  "$BUILD_LAUNCHER" \
#  "$COMPRESS" \
#  "$ARCHIVE_NAME" \
#  "/Managed.zip" \
#  "$SPT_MODULES_BRANCH" \
#  "$SPT_LAUNCHER_BRANCH" \
#  "$SPT_BUILD_BRANCH"


echo ""
echo "=== 构建完成 ==="
if [ "$COMPRESS" = true ]; then
  echo "压缩文件: $OUTPUT_DIR/$ARCHIVE_NAME"
  if [ -f "$OUTPUT_DIR/$ARCHIVE_NAME" ]; then
    ls -lh "$OUTPUT_DIR/$ARCHIVE_NAME"
  else
    echo "错误: 压缩文件未生成"
  fi
else
  echo "输出目录: $OUTPUT_DIR"
  if [ -d "$OUTPUT_DIR" ]; then
    ls -la "$OUTPUT_DIR"
    [ -d "$OUTPUT_DIR/modules" ] && echo -e "\nModules 文件数量: $(find "$OUTPUT_DIR/modules" -type f | wc -l)"
    [ -d "$OUTPUT_DIR/launcher" ] && echo "Launcher 文件数量: $(find "$OUTPUT_DIR/launcher" -type f | wc -l)"
  else
    echo "错误: 输出目录未生成"
  fi
fi