name: Pilipala Beta

on:
  workflow_dispatch:
  push:
    branches:
      - "never"
    paths-ignore:
      - "**.md"
      - "**.txt"
      - ".github/**"
      - ".idea/**"
      - "!.github/workflows/**"


jobs:
  update_version:
    name: Read and update version
    runs-on: ubuntu-latest

    outputs:
      # 定义输出变量 version，以便在其他job中引用
      new_version: ${{ steps.version.outputs.new_version }}
      last_commit: ${{ steps.get-last-commit.outputs.last_commit }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          ref: ${{ github.ref_name }}
          fetch-depth: 0

      - name: 获取first parent commit次数
        id: get-first-parent-commit-count
        run: |
          version=$(yq e .version pubspec.yaml | cut -d "+" -f 1)
          recent_release_tag=$(git tag -l | grep $version | egrep -v "[-|+]" || true)
          if [[ "x$recent_release_tag" == "x" ]]; then
            echo "当前版本tag不存在，请手动生成tag."
            exit 1
          fi
          git log --oneline --first-parent $recent_release_tag..HEAD
          first_parent_commit_count=$(git rev-list --first-parent --count $recent_release_tag..HEAD)
          echo "count=$first_parent_commit_count" >> $GITHUB_OUTPUT

      - name: 获取最后一次提交
        id: get-last-commit
        run: |
          last_commit=$(git log -1 --pretty="%h %s" --first-parent)
          echo "last_commit=$last_commit" >> $GITHUB_OUTPUT

      - name: 更新版本号
        id: version
        run: |
          # 读取版本号
          VERSION=$(yq e .version pubspec.yaml | cut -d "+" -f 1)

          # 获取GitHub Actions的run_number
          #RUN_NUMBER=${{ github.run_number }}

          # 构建新版本号
          NEW_VERSION=$VERSION-beta.${{ steps.get-first-parent-commit-count.outputs.count }}

          # 输出新版本号
          echo "New version: $NEW_VERSION"

          # 设置新版本号为输出变量
          echo "new_version=$NEW_VERSION" >>$GITHUB_OUTPUT

  android:
    name: Build CI (Android)
    needs: update_version
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          ref: ${{ github.ref_name }}

      - name: 构建Java环境
        uses: actions/setup-java@v3
        with:
          distribution: "zulu"
          java-version: "17"
          token: ${{secrets.GIT_TOKEN}}

      - name: 检查缓存
        uses: actions/cache@v2
        id: cache-flutter
        with:
          path: /root/flutter-sdk
          key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}

      - name: 安装Flutter
        if: steps.cache-flutter.outputs.cache-hit != 'true'
        uses: subosito/flutter-action@v2
        with:
          flutter-version: 3.16.5
          channel: any

      - name: 下载项目依赖
        run: flutter pub get

      - name: 解码生成 jks
        run: echo $KEYSTORE_BASE64 | base64 -di > android/app/vvex.jks
        env:
          KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}

      - name: 更新版本号
        id: version
        run: |
          # 更新pubspec.yaml文件中的版本号
          sed -i "s/version: .*+/version: ${{ needs.update_version.outputs.new_version }}+/g" pubspec.yaml

      - name: flutter build apk
        run: flutter build apk --release --split-per-abi
        env:
          KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
          KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
          KEY_PASSWORD: ${{ secrets.KEY_PASSWORD}}

      - name: 重命名应用
        run: |
          for file in build/app/outputs/flutter-apk/app-*.apk; do
            if [[ $file =~ app-(.?*)release.apk ]]; then
              new_file_name="build/app/outputs/flutter-apk/Pili-${BASH_REMATCH[1]}v${{ needs.update_version.outputs.new_version }}.apk"
              mv "$file" "$new_file_name"
            fi
          done

      - name: 上传
        uses: actions/upload-artifact@v3
        with:
          name: Pilipala-Beta
          path: |
            build/app/outputs/flutter-apk/Pili-*.apk

  iOS:
    name: Build CI (iOS)
    needs: update_version
    runs-on: macos-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          ref: ${{ github.ref_name }}

      - name: 安装Flutter
        if: steps.cache-flutter.outputs.cache-hit != 'true'
        uses: subosito/flutter-action@v2.10.0
        with:
          cache: true
          flutter-version: 3.16.5

      - name: 更新版本号
        id: version
        run: |
          # 更新pubspec.yaml文件中的版本号
          sed -i "" "s/version: .*+/version: ${{ needs.update_version.outputs.new_version }}+/g" pubspec.yaml

      - name: flutter build ipa
        run: |
          flutter build ios --release --no-codesign 
          ln -sf ./build/ios/iphoneos Payload
          zip -r9 app.ipa Payload/runner.app

      - name: 重命名应用
        run: |
          DATE=${{ steps.date.outputs.date }}
          for file in app.ipa; do
            new_file_name="build/Pili-v${{ needs.update_version.outputs.new_version }}.ipa"
            mv "$file" "$new_file_name"
          done

      - name: 上传
        uses: actions/upload-artifact@v3
        with:
          if-no-files-found: error
          name: Pilipala-Beta
          path: |
            build/Pili-*.ipa

  upload:
    runs-on: ubuntu-latest

    needs:
      - update_version
      - android
      - iOS
    steps:
      - uses: actions/download-artifact@v3
        with:
          name: Pilipala-Beta
          path: ./Pilipala-Beta

      - name: 发送到Telegram频道
        uses: xireiki/channel-post@v1.0.7
        with:
          bot_token: ${{ secrets.BOT_TOKEN }}
          chat_id: ${{ secrets.CHAT_ID }}
          large_file: true
          api_id: ${{ secrets.TELEGRAM_API_ID }}
          api_hash: ${{ secrets.TELEGRAM_API_HASH }}
          method: sendFile
          path: Pilipala-Beta/*
          parse_mode: Markdown
          context: "*Beta版本: v${{ needs.update_version.outputs.new_version }}*\n更新内容: [${{ needs.update_version.outputs.last_commit }}](${{ github.event.head_commit.url }})"
