name: CI

on:
  workflow_dispatch:
  # push:
  #   branches:
  #     - 'main'
  #   paths-ignore:
  #     - '**.md'
  #     - '**.txt'
  #     - '.github/**'
  #     - '.idea/**'
  #     - '!.github/workflows/CI.yml'

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

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

    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          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 HEAD
      #    first_parent_commit_count=$(git rev-list --first-parent --count $recent_release_tag..HEAD)
      #    echo "count=$first_parent_commit_count" >> $GITHUB_OUTPUT

      - name: 从tag获取之前的version_code与beta版本号
        id: get-previous-codes
        run: |
          version=$(yq e .version pubspec.yaml | cut -d "+" -f 1)
          last_tag=$(git tag --sort=committerdate | tail -1)
          if (echo $last_tag | grep -v "+"); then
            echo "Tag格式不正确"
            exit 1
          elif (echo $last_tag | grep -v $version); then
            echo "当前版本tag不存在，请手动添加tag."
            exit 1
          fi

          version_code=$(echo $last_tag | cut -d "+" -f 2)
          beta_code=$(echo $last_tag | cut -d "+" -f 1 | cut -d "." -f 4)
          beta_code=${beta_code:-0}

          echo "beta-code=$beta_code" >> $GITHUB_OUTPUT
          echo "version-code=$version_code" >> $GITHUB_OUTPUT

      - name: 更新版本号
        id: version
        run: |
          # 读取版本号
          version_name=$(yq e .version pubspec.yaml | cut -d "+" -f 1)
          let beta_code=${{ steps.get-previous-codes.outputs.beta-code }}+1
          let version_code=${{ steps.get-previous-codes.outputs.version-code }}+1
          # 构建新版本号
          NEW_VERSION=${version_name}-beta.${beta_code}+${version_code}
    
          # 输出新版本号
          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@v2

      - 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.24.0
            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: flutter build apk
        run: |
          sed -i "s/version: .*/version: ${{ needs.update_version.outputs.new_version }}0/g" pubspec.yaml
          flutter build apk --release
        env:
          KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
          KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
          KEY_PASSWORD: ${{ secrets.KEY_PASSWORD}}

      - name: 重命名应用
        run: |
          version_name=$(yq e .version pubspec.yaml | cut -d "+" -f 1)
          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]}${version_name}.apk"
              mv "$file" "$new_file_name"
            fi
          done

      - name: 上传
        uses: actions/upload-artifact@v3
        with:
          name: Pilipala-CI
          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@v2

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

      - 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: |
          version_name=$(yq e .version pubspec.yaml | cut -d "+" -f 1)
          for file in app.ipa; do
            new_file_name="build/Pili-${version_name}.ipa"
            mv "$file" "$new_file_name"
          done

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

  upload:
    runs-on: ubuntu-latest

    needs:
      - update_version
      - android
      - iOS
    steps:

      - uses: actions/download-artifact@v3
        with:
          name: Pilipala-CI
          path: ./Pilipala-CI
          
      - name: Upload Pre-release
        uses: ncipollo/release-action@v1
        with:
          name: ${{ needs.update_version.outputs.new_version }}
          token: ${{ secrets.GIT_TOKEN }}
          commit: main
          tag: ${{ needs.update_version.outputs.new_version }}
          prerelease: true
          allowUpdates: true
          artifacts: Pilipala-CI/*
