name: Publish Mini Program Dev Version

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - "mini/**"
      - ".gitea/workflows/miniapp-preview.yml"

jobs:
  publish:
    # 专属运行器 lunar-node: docker://node:22-bookworm（注册于 doc79）
    runs-on: lunar-node
    steps:
      - uses: https://gitea.neatcn.com/gouki/action-checkout@v4
        with:
          # Need recent commit subjects for the WeChat upload remark.
          fetch-depth: 20
      - name: Verify Node runtime
        run: node --version
      - name: Install dependencies
        working-directory: mini
        run: npm ci
      - name: Run tests
        working-directory: mini
        run: npm test -- --runInBand
      - name: Configure production API and app version
        working-directory: mini
        env:
          MINIAPP_BUILD_NUMBER: ${{ gitea.run_number }}
          MINIAPP_VERSION_OVERRIDE: ${{ vars.MINIAPP_VERSION_OVERRIDE }}
        run: |
          test -n "$MINIAPP_BUILD_NUMBER"
          VERSION="$(node -e 'const {resolveVersion}=require("./ci/resolve-version.cjs"); process.stdout.write(resolveVersion(process.cwd()))')"
          test -n "$VERSION"
          mkdir -p ci-artifacts
          printf '%s\n' "$VERSION" > ci-artifacts/resolved-version.txt
          echo "Resolved Mini Program version for build+upload: $VERSION"
      - name: Materialize the upload key
        env:
          WECHAT_CI_PRIVATE_KEY: ${{ secrets.WECHAT_CI_PRIVATE_KEY }}
        run: |
          test -n "$WECHAT_CI_PRIVATE_KEY"
          umask 077
          printf '%s' "$WECHAT_CI_PRIVATE_KEY" > "$RUNNER_TEMP/wechat-ci.key"
      - name: Upload WeChat development version
        working-directory: mini
        env:
          MINIAPP_APPID: ${{ vars.MINIAPP_APPID }}
          MINIAPP_ROBOT: ${{ vars.MINIAPP_ROBOT }}
          # Prefer the version resolved before build so UI label matches WeChat upload.
          MINIAPP_BUILD_NUMBER: ${{ gitea.run_number }}
          MINIAPP_VERSION_OVERRIDE: ${{ vars.MINIAPP_VERSION_OVERRIDE }}
          WECHAT_CI_PRIVATE_KEY_PATH: ${{ runner.temp }}/wechat-ci.key
          MINIAPP_UPLOAD_RESULT: ${{ gitea.workspace }}/mini/ci-artifacts/upload-result.json
          MINIAPP_VERSION_LABEL: ${{ gitea.sha }}
          MINIAPP_UPLOAD_DESC_ITEMS: "3"
          MINIAPP_UPLOAD_DESC_MAX: "100"
        run: |
          test -n "$MINIAPP_APPID"
          test -n "$MINIAPP_BUILD_NUMBER"
          test -s ci-artifacts/resolved-version.txt
          RESOLVED_VERSION="$(tr -d '\n' < ci-artifacts/resolved-version.txt)"
          # Force upload to the same version that was baked into the JS bundle.
          export MINIAPP_VERSION_OVERRIDE="$RESOLVED_VERSION"
          mkdir -p ci-artifacts
          node -e 'const c=require("./project.config.json"); if(c.appid!==process.env.MINIAPP_APPID){console.error("MINIAPP_APPID mismatch with project.config.json", process.env.MINIAPP_APPID, c.appid); process.exit(1)}'
          node -e 'const {resolveVersion}=require("./ci/resolve-version.cjs"); console.log("Resolved Mini Program version:", resolveVersion(process.cwd()))'
          node -e 'const {resolveUploadDesc}=require("./ci/resolve-upload-desc.cjs"); console.log("Resolved upload remark:", resolveUploadDesc({repoRoot:require("path").resolve(".."), versionLabel:process.env.MINIAPP_VERSION_LABEL}))'
          # Normalize PEM newlines that may be flattened when stored in Secrets.
          python3 - <<'PY'
          from pathlib import Path
          import os
          key_path = Path(os.environ["WECHAT_CI_PRIVATE_KEY_PATH"])
          text = key_path.read_text()
          if "\\n" in text and "BEGIN" in text:
              text = text.replace("\\n", "\n")
          text = text.replace("\r\n", "\n").strip() + "\n"
          key_path.write_text(text)
          content = key_path.read_text()
          assert "BEGIN" in content and "PRIVATE KEY" in content, "WECHAT_CI_PRIVATE_KEY is not a PEM private key"
          print("private_key_lines=", len(content.splitlines()))
          PY
          node ci/upload-ci.cjs
          test -s ci-artifacts/upload-result.json
          cat ci-artifacts/upload-result.json
      - name: Persist upload result on runner host
        run: |
          test -s mini/ci-artifacts/upload-result.json
          test -d /ci-artifacts
          cp mini/ci-artifacts/upload-result.json "/ci-artifacts/miniapp-upload-${{ gitea.sha }}.json"
          cp mini/ci-artifacts/upload-result.json /ci-artifacts/miniapp-upload-latest.json
          ls -la /ci-artifacts/miniapp-upload-latest.json
          echo "Upload result saved on runner host: /opt/lunar/ci-artifacts/miniapp-upload-latest.json"
      
      - name: Send success notification
        if: success()
        env:
          TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
          TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
          DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
        run: |
          VERSION="$(tr -d '\n' < mini/ci-artifacts/resolved-version.txt)"
          bash .gitea/scripts/notify.sh success "小程序开发版上传成功" "版本: ${VERSION} 上传结果已保存到: /opt/lunar/ci-artifacts/miniapp-upload-latest.json"
      
      - name: Send failure notification
        if: failure()
        env:
          TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
          TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
          DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
        run: |
          bash .gitea/scripts/notify.sh failure \
            "小程序开发版上传失败" \
            "请检查 Actions 日志了解失败原因"
      
      - name: Remove temporary credentials
        if: always()
        run: rm -f "$RUNNER_TEMP/wechat-ci.key"
