name: build

on:
  push:
    tags:
      - 'v*'
env:
  IS_STABLE: ${{ !contains(github.ref, '-') }}

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - platform: android
            os: ubuntu-latest
          - platform: windows
            os: windows-latest
            arch: amd64
          - platform: linux
            os: ubuntu-22.04
            arch: amd64
          - platform: macos
            os: macos-13
            arch: amd64
          - platform: macos
            os: macos-latest
            arch: arm64
          - platform: windows
            os: windows-11-arm
            arch: arm64
          - platform: linux
            os: ubuntu-24.04-arm
            arch: arm64

    steps:
      - name: Setup rust
        if: startsWith(matrix.os, 'windows-11-arm')
        run: |
          Invoke-WebRequest -Uri "https://win.rustup.rs/aarch64" -OutFile rustup-init.exe
          .\rustup-init.exe -y --default-toolchain stable
          $cargoPath = "$env:USERPROFILE\.cargo\bin"
          Add-Content $env:GITHUB_PATH $cargoPath

      - name: Checkout
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Setup Android Signing
        if: startsWith(matrix.platform,'android')
        run: |
          echo "${{ secrets.KEYSTORE }}" | base64 --decode > android/app/keystore.jks
          echo "keyAlias=${{ secrets.KEY_ALIAS }}" >> android/local.properties
          echo "storePassword=${{ secrets.STORE_PASSWORD }}" >> android/local.properties
          echo "keyPassword=${{ secrets.KEY_PASSWORD }}" >> android/local.properties

      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.24.0'
          cache-dependency-path: |
            core/go.sum

      - name: Setup Flutter Master
        if: startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm')
        uses: subosito/flutter-action@v2
        with:
          channel: 'master'
          cache: true
      - name: Setup Flutter
        if: ${{ !(startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm')) }}
        uses: subosito/flutter-action@v2
        with:
          channel: 'stable'
          cache: true
          flutter-version: 3.29.3

      - name: Get Flutter Dependency
        run: flutter pub get

      - name: Setup
        run: dart setup.dart ${{ matrix.platform }} ${{ matrix.arch && format('--arch {0}', matrix.arch) }} ${{ env.IS_STABLE == 'true' && '--env stable' || '' }}

      - name: Upload
        uses: actions/upload-artifact@v4
        with:
          name: artifact-${{ matrix.platform }}${{ matrix.arch && format('-{0}', matrix.arch) }}
          path: ./dist
          overwrite: true

  changelog:
    runs-on: ubuntu-latest
    needs: [ build ]
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        if: ${{ env.IS_STABLE == 'true' }}
        with:
          fetch-depth: 0
          ref: refs/heads/main
      - name: Generate
        if: ${{ env.IS_STABLE == 'true' }}
        run: |
          tags=($(git tag --merged $(git rev-parse HEAD) --sort=-creatordate))
          preTag=$(grep -oP '^## \K.*' CHANGELOG.md | head -n 1)
          currentTag=""
          for ((i = 0; i <= ${#tags[@]}; i++)); do
            if (( i < ${#tags[@]} )); then
              tag=${tags[$i]}
            else
              tag=""
            fi
            if [ -n "$currentTag" ]; then
              if [ "$(echo -e "$currentTag\n$preTag" | sort -V | head -n 1)" == "$currentTag" ]; then
                break
              fi
            fi
            if [ -n "$currentTag" ]; then
              echo "## $currentTag" >> NEW_CHANGELOG.md
              echo "" >> NEW_CHANGELOG.md
              if [ -n "$tag" ]; then
                git log --pretty=format:"%B" "$tag..$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> NEW_CHANGELOG.md
              else
                git log --pretty=format:"%B" "$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> NEW_CHANGELOG.md
              fi
              echo "" >> NEW_CHANGELOG.md
            fi
            currentTag=$tag
          done
          cat CHANGELOG.md >> NEW_CHANGELOG.md
          cat NEW_CHANGELOG.md > CHANGELOG.md

      - name: Commit
        if: ${{ env.IS_STABLE == 'true' }}
        run: |
          git add CHANGELOG.md
          if ! git diff --cached --quiet; then
            echo "Commit pushing"
            git config --local user.email "chen08209@gmail.com"
            git config --local user.name "chen08209"
            git commit -m "Update changelog"
            git push
            if [ $? -eq 0 ]; then
              echo "Push succeeded"
            else
              echo "Push failed"
              exit 1
            fi
          fi

        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  upload:
    permissions: write-all
    needs: [ build ]
    runs-on: ubuntu-latest
    services:
      telegram-bot-api:
        image: aiogram/telegram-bot-api:latest
        env:
          TELEGRAM_API_ID: ${{ secrets.TELEGRAM_API_ID }}
          TELEGRAM_API_HASH: ${{ secrets.TELEGRAM_API_HASH }}
        ports:
          - 8081:8081
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Download
        uses: actions/download-artifact@v4
        with:
          path: ./dist/
          pattern: artifact-*
          merge-multiple: true

      - name: Generate release.md
        run: |
          tags=($(git tag --merged $(git rev-parse HEAD) --sort=-creatordate))
          preTag=$(curl --silent "https://api.github.com/repos/chen08209/FlClash/releases/latest" | grep -Po '"tag_name": "\K.*?(?=")' || echo "")
          currentTag=""
          for ((i = 0; i <= ${#tags[@]}; i++)); do
            if (( i < ${#tags[@]} )); then
              tag=${tags[$i]}
            else
              tag=""
            fi
            if [ -n "$currentTag" ]; then
              if [ "$(echo -e "$currentTag\n$preTag" | sort -V | head -n 1)" == "$currentTag" ]; then
                break
              fi
            fi
            if [ -n "$currentTag" ]; then
              if [ -n "$tag" ]; then
                git log --pretty=format:"%B" "$tag..$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> release.md
              else
                git log --pretty=format:"%B" "$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> release.md
              fi
              echo "" >> release.md
            fi
            currentTag=$tag
          done

      - name: Push to telegram
        env:
          TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
          TAG: ${{ github.ref_name }}
          RUN_ID: ${{ github.run_id }}
        run: |
          python -m pip install --upgrade pip
          pip install requests
          python release_telegram.py

      - name: Patch release.md
        run: |
          version=$(echo "${{ github.ref_name }}" | sed 's/^v//')
          sed "s|VERSION|$version|g" ./.github/release_template.md >> release.md

      - name: Generate sha256
        if: env.IS_STABLE == 'true'
        run: |
          cd ./dist
          for file in $(find . -type f -not -name "*.sha256"); do
            sha256sum "$file" > "${file}.sha256"
          done  

      - name: Release
        if: ${{ env.IS_STABLE == 'true' }}
        uses: softprops/action-gh-release@v2
        with:
          files: ./dist/*
          body_path: './release.md'

      - name: Create Fdroid Source Dir
        if: ${{ env.IS_STABLE == 'true' }}
        run: |
          mkdir -p ./tmp
          cp ./dist/*android-arm64-v8a* ./tmp/ || true
          echo "Files copied successfully"

      - name: Push to fdroid repo
        if: ${{ env.IS_STABLE == 'true' }}
        uses: cpina/github-action-push-to-another-repository@v1.7.2
        env:
          SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
        with:
          source-directory: ./tmp/
          destination-github-username: chen08209
          destination-repository-name: FlClash-fdroid-repo
          user-name: 'github-actions[bot]'
          user-email: 'github-actions[bot]@users.noreply.github.com'
          target-branch: main
          commit-message: Update from ${{ github.ref_name }}
          target-directory: /tmp/

