name: Release Build
on:
  push:
    tags: ["*"]
  workflow_dispatch:
    inputs:
      version:
        description: "版本号 (例如: v1.0.0, v1.1.0-alpha)"
        required: true
        default: "dev-build"

jobs:
  build-linux-x64:
    runs-on: ubuntu
    container:
      image: git.fig-lang.cn/puqiar/fig-ci:base-latest
      options: --network=host

    steps:
      - name: 验证构建环境
        run: |
          echo "=== 环境验证开始 ==="
          xmake --version
          clang++ --version | head -1
          echo "=== 环境验证通过 ==="

      - name: 检出代码
        run: |
          git clone https://git.fig-lang.cn/${{ github.repository }} .
          git checkout ${{ github.ref }}

      - name: 设置版本
        run: |
          if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
            VERSION="${{ inputs.version }}"
          else
            VERSION="${GITHUB_REF#refs/tags/}"
          fi
          echo "构建版本: $VERSION"
          echo "VERSION=$VERSION" >> $GITHUB_ENV

      - name: 获取提交信息
        run: |
          # 获取最新提交信息，如果是标签则获取标签指向的提交
          if git describe --tags --exact-match >/dev/null 2>&1; then
            # 标签发布：获取标签关联的提交信息
            COMMIT_HASH=$(git rev-list -n 1 $VERSION)
            COMMIT_MSG=$(git log -1 --pretty=format:"%s" $COMMIT_HASH)
            COMMIT_BODY=$(git log -1 --pretty=format:"%b" $COMMIT_HASH)
          else
            # 手动触发或非标签提交：获取最新提交信息
            COMMIT_MSG=$(git log -1 --pretty=format:"%s")
            COMMIT_BODY=$(git log -1 --pretty=format:"%b")
          fi
          
          # 组合完整的提交信息
          if [ -n "$COMMIT_BODY" ]; then
            RELEASE_BODY="${COMMIT_MSG}%0A%0A${COMMIT_BODY}"
          else
            RELEASE_BODY="${COMMIT_MSG}"
          fi
          
          # 保存到环境变量
          echo "RELEASE_BODY=${RELEASE_BODY}" >> $GITHUB_ENV
          echo "提交信息已保存"

      - name: 构建项目 (Linux)
        run: |
          echo "开始构建Linux版本..."
          xmake f -p linux -a x86_64 -m release -y
          xmake build -j$(nproc)
          echo "Linux构建成功。"

      - name: 构建Linux安装器
        run: |
          echo "开始构建Linux安装器..."
          cd Installer/ConsoleInstaller
          python3 -m venv venv
          . venv/bin/activate
          pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
          pip install --upgrade pip
          pip install -r requirements.txt
          python3 -m PyInstaller -F -n FigSetup-Linux --distpath ./dist/linux main.py
          echo "Linux安装器构建完成"

      - name: 打包Linux发布文件
        run: |
          VERSION="${{ env.VERSION }}"
          PACKAGE_NAME="Fig-${VERSION}-linux-x86_64"
          mkdir -p "${PACKAGE_NAME}"
          cp build/linux/x86_64/release/Fig "${PACKAGE_NAME}/"
          if [ -d "src/Module/Library" ]; then
            cp -r src/Module/Library "${PACKAGE_NAME}/"
            echo "已包含Library目录。"
          fi
          tar -czf "${PACKAGE_NAME}.tar.gz" "${PACKAGE_NAME}"
          sha256sum "${PACKAGE_NAME}.tar.gz" > "${PACKAGE_NAME}.sha256"
          echo "Linux打包完成: ${PACKAGE_NAME}.tar.gz"

      - name: 发布Linux版本到Gitea
        env:
          GITEA_TOKEN: ${{ secrets.CI_TOKEN }}
        run: |
          VERSION="${{ env.VERSION }}"
          RELEASE_BODY="${{ env.RELEASE_BODY }}"
          API="https://git.fig-lang.cn/api/v1/repos/${{ github.repository }}"
          
          # 根据版本后缀判断是否为预发布
          if [[ "$VERSION" =~ -(alpha|beta|dev|rc) ]] || [[ "$VERSION" == "dev-build" ]]; then
            PRERELEASE=true
            echo "检测到预发布版本: $VERSION"
          else
            PRERELEASE=false
            echo "检测到稳定版本: $VERSION"
          fi
          
          echo "正在为Linux版本创建/更新发布 $VERSION ..."
          echo "发布描述: ${RELEASE_BODY//%0A/$'\n'}"
          
          RESPONSE=$(curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \
            -H "Content-Type: application/json" \
            -d "{\"tag_name\":\"$VERSION\",\"name\":\"Fig $VERSION\",\"body\":\"$RELEASE_BODY\",\"draft\":false,\"prerelease\":$PRERELEASE}" \
            "$API/releases" 2>/dev/null || echo '{"id":0}')
          
          RELEASE_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2)
          
          if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "0" ]; then
            echo "尝试通过标签获取已有发布的ID..."
            RELEASE_ID=$(curl -sS -H "Authorization: token $GITEA_TOKEN" \
              "$API/releases/tags/$VERSION" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2)
          fi
          
          if [ -z "$RELEASE_ID" ]; then
            echo "错误：无法获取或创建发布 ID"
            exit 1
          fi
          
          echo "使用发布 ID: $RELEASE_ID 进行上传"
          
          # 上传语言包
          curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \
            -H "Content-Type: application/octet-stream" \
            --data-binary @Fig-$VERSION-linux-x86_64.tar.gz \
            "$API/releases/$RELEASE_ID/assets?name=Fig-$VERSION-linux-x86_64.tar.gz"
          
          curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \
            -H "Content-Type: text/plain" \
            --data-binary @Fig-$VERSION-linux-x86_64.sha256 \
            "$API/releases/$RELEASE_ID/assets?name=Fig-$VERSION-linux-x86_64.sha256"
          
          # 上传Linux安装器
          if [ -f "Installer/ConsoleInstaller/dist/linux/FigSetup-Linux" ]; then
            echo "正在上传Linux安装器..."
            curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \
              -H "Content-Type: application/octet-stream" \
              --data-binary @Installer/ConsoleInstaller/dist/linux/FigSetup-Linux \
              "$API/releases/$RELEASE_ID/assets?name=FigSetup-Linux"
          fi
          
          echo "✅ Linux版本发布完成！"

  build-windows-x64:
    runs-on: windows

    steps:
      - name: 验证Windows工具链
        run: |
          Set-ExecutionPolicy Bypass -Scope Process -Force
          if (Get-Command xmake -ErrorAction SilentlyContinue) {
            Write-Host '✅ xmake 已安装'
            xmake --version
          } else { Write-Host '警告: xmake 未找到' }
          if (Get-Command clang++ -ErrorAction SilentlyContinue) {
            Write-Host '✅ clang++ 已安装'
            clang++ --version
          } else { Write-Host '警告: clang++ 未找到' }

      - name: 检出代码
        run: |
          $env:Path = "C:\Program Files\Git\cmd;$env:Path"
          git clone https://git.fig-lang.cn/$env:GITHUB_REPOSITORY .
          git checkout $env:GITHUB_REF

      - name: 设置版本和提交信息 (Windows)
        run: |
          [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
          
          # 版本号获取：直接从工作流上下文中获取
          $eventType = '${{ github.event_name }}'
          
          if ($eventType -eq 'workflow_dispatch') {
            $VERSION = '${{ inputs.version }}'
          } else {
            $VERSION = '${{ github.ref_name }}'
          }
          
          # 如果版本号为空，使用默认值
          if ([string]::IsNullOrWhiteSpace($VERSION)) {
            $VERSION = "dev-build"
          }
          
          Write-Host "构建版本: $VERSION"
          
          # 获取提交信息
          if (git describe --tags --exact-match 2>$null) {
            # 标签发布：获取标签关联的提交信息
            $COMMIT_HASH = git rev-list -n 1 $VERSION 2>$null
            if ($COMMIT_HASH) {
              $COMMIT_MSG = git log -1 --pretty=format:"%s" $COMMIT_HASH 2>$null
              $COMMIT_BODY = git log -1 --pretty=format:"%b" $COMMIT_HASH 2>$null
            }
          }
          
          if (-not $COMMIT_MSG) {
            # 手动触发或非标签提交：获取最新提交信息
            $COMMIT_MSG = git log -1 --pretty=format:"%s" 2>$null
            $COMMIT_BODY = git log -1 --pretty=format:"%b" 2>$null
          }
          
          # 组合完整的提交信息
          $RELEASE_BODY = $COMMIT_MSG
          if (-not [string]::IsNullOrWhiteSpace($COMMIT_BODY)) {
            $RELEASE_BODY = "$COMMIT_MSG`n`n$COMMIT_BODY"
          }
          
          # 替换换行符为URL编码（用于JSON）
          $RELEASE_BODY_JSON = $RELEASE_BODY -replace "`n", "\n" -replace "`r", "\r"
          
          # 保存到环境变量
          "VERSION=$VERSION" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
          "RELEASE_BODY=$RELEASE_BODY_JSON" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
          
          Write-Host "版本和提交信息已保存"

      - name: 构建项目 (Windows Native)
        run: |
          xmake f -p windows -a x86_64 -m release -y
          xmake build -j $env:NUMBER_OF_PROCESSORS
          Write-Host 'Windows构建成功。'

      - name: 构建Windows安装器
        run: |
          [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
          Write-Host "开始构建Windows安装器..."
          cd Installer\ConsoleInstaller
          pip install -r requirements.txt
          pyinstaller -F -i logo.ico -n FigSetup --distpath .\dist\windows main.py
          Write-Host "Windows安装器构建完成"

      - name: 打包Windows发布文件
        run: |
          [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
          
          $VERSION = $env:VERSION
          Write-Host "打包版本: $VERSION"
          
          $PACKAGE_NAME = "Fig-${VERSION}-windows-x86_64"
          Write-Host "打包名称: $PACKAGE_NAME"
          
          New-Item -ItemType Directory -Force -Path $PACKAGE_NAME
          
          if (Test-Path 'build\windows\x86_64\release\Fig.exe') {
            Copy-Item 'build\windows\x86_64\release\Fig.exe' $PACKAGE_NAME\
          } elseif (Test-Path 'build\windows\x86_64\release\Fig') {
            Copy-Item 'build\windows\x86_64\release\Fig' $PACKAGE_NAME\Fig.exe
          } else {
            Write-Host '错误：未找到构建输出文件'
            exit 1
          }
          
          if (Test-Path 'src\Module\Library') {
            Copy-Item -Recurse 'src\Module\Library' $PACKAGE_NAME\
          }
          
          $ZIP_NAME = "$PACKAGE_NAME.zip"
          Compress-Archive -Path $PACKAGE_NAME -DestinationPath $ZIP_NAME
          
          $Hash = Get-FileHash $ZIP_NAME -Algorithm SHA256
          "$($Hash.Hash)  $ZIP_NAME" | Out-File "$PACKAGE_NAME.sha256" -Encoding UTF8
          
          Write-Host "Windows打包完成: $ZIP_NAME"
          
      - name: 发布Windows版本到Gitea
        env:
          GITEA_TOKEN: ${{ secrets.CI_TOKEN }}
        run: |
          [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
          
          $VERSION = $env:VERSION
          $RELEASE_BODY = $env:RELEASE_BODY
          $REPO = $env:GITHUB_REPOSITORY
          $API = "https://git.fig-lang.cn/api/v1/repos/$REPO"
          $TOKEN = $env:GITEA_TOKEN
          
          # 根据版本后缀判断是否为预发布
          if ($VERSION -match '-(alpha|beta|dev|rc)') {
            $PRERELEASE = $true
            Write-Host "检测到预发布版本: $VERSION"
          } elseif ($VERSION -eq 'dev-build') {
            $PRERELEASE = $true
            Write-Host "检测到开发构建版本: $VERSION"
          } else {
            $PRERELEASE = $false
            Write-Host "检测到稳定版本: $VERSION"
          }
          
          # 恢复换行符
          $RELEASE_BODY = $RELEASE_BODY -replace "\\n", "`n" -replace "\\r", "`r"
          
          Write-Host "正在上传Windows版本到发布: $VERSION"
          Write-Host "发布描述: $RELEASE_BODY"
          
          $ZIP_FILE = "Fig-$VERSION-windows-x86_64.zip"
          $HASH_FILE = "Fig-$VERSION-windows-x86_64.sha256"
          $INSTALLER_PATH = "Installer\ConsoleInstaller\dist\windows\FigSetup.exe"
          
          if (-not (Test-Path $ZIP_FILE)) {
            Write-Host "❌ 错误：找不到ZIP文件 $ZIP_FILE"
            Get-ChildItem *.zip
            exit 1
          }
          
          Write-Host "正在为Windows版本创建/更新发布 $VERSION ..."
          
          # 准备发布请求体
          $CREATE_BODY = @{
            tag_name = $VERSION
            name = "Fig $VERSION"
            body = $RELEASE_BODY
            draft = $false
            prerelease = $PRERELEASE
          } | ConvertTo-Json
          
          # 创建或获取发布
          $RESPONSE = Invoke-RestMethod -Method Post -Uri "$API/releases" `
            -Headers @{
              Authorization = "token $TOKEN"
              'Content-Type' = 'application/json'
            } -Body $CREATE_BODY -ErrorAction SilentlyContinue
          
          if (-not $RESPONSE -or -not $RESPONSE.id) {
            Write-Host "创建失败，尝试获取已有发布..."
            $RESPONSE = Invoke-RestMethod -Uri "$API/releases/tags/$VERSION" `
              -Headers @{Authorization = "token $TOKEN" } `
              -ErrorAction SilentlyContinue
          }
          
          if ($RESPONSE -and $RESPONSE.id) {
            $RELEASE_ID = $RESPONSE.id
            Write-Host "✅ 使用发布 ID: $RELEASE_ID 进行上传"
          } else {
            Write-Host "❌ 错误：无法获取或创建发布 ID"
            exit 1
          }
          
          # 上传资产
          Write-Host "正在上传 ZIP 文件..."
          Invoke-RestMethod -Method Post -Uri "$API/releases/$RELEASE_ID/assets?name=$ZIP_FILE" `
            -Headers @{
              Authorization = "token $TOKEN"
              'Content-Type' = 'application/octet-stream'
            } -InFile $ZIP_FILE -ErrorAction SilentlyContinue
          
          Write-Host "正在上传校验文件..."
          Invoke-RestMethod -Method Post -Uri "$API/releases/$RELEASE_ID/assets?name=$HASH_FILE" `
            -Headers @{
              Authorization = "token $TOKEN"
              'Content-Type' = 'text/plain'
            } -InFile $HASH_FILE -ErrorAction SilentlyContinue
          
          if (Test-Path $INSTALLER_PATH) {
            Write-Host "正在上传Windows安装器..."
            Invoke-RestMethod -Method Post -Uri "$API/releases/$RELEASE_ID/assets?name=FigSetup.exe" `
              -Headers @{
                Authorization = "token $TOKEN"
                'Content-Type' = 'application/octet-stream'
              } -InFile $INSTALLER_PATH -ErrorAction SilentlyContinue
          }
          
          Write-Host "✅ Windows版本发布完成！"