name: Push Pipeline

on:
  push:
    branches:
      - "development"
      - "main"

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Java (Temurin 17)
        uses: actions/setup-java@v3
        with:
          distribution: temurin
          java-version: '17'

      - name: Setup Android SDK
        uses: android-actions/setup-android@v3

      # Required for Flutter action
      - name: Install jq
        run: |
          apt-get update
          apt-get install -y jq 

      - name: Set up Flutter
        uses: subosito/flutter-action@v2
        with:
          channel: stable
          flutter-version: 3.38.6

      - name: Get dependencies
        run: |
          git config --global --add safe.directory /opt/hostedtoolcache/flutter/stable-3.38.6-x64
          flutter pub get

      - name: Build APK
        run: flutter build apk --release
  
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      # Required for Flutter action
      - name: Install jq
        run: |
          apt-get update
          apt-get install -y jq 

      - name: Set up Flutter
        uses: subosito/flutter-action@v2
        with:
          channel: stable
          flutter-version: 3.38.6

      - name: Get dependencies
        run: |
          git config --global --add safe.directory /opt/hostedtoolcache/flutter/stable-3.38.6-x64
          flutter pub get

      - name: Run tests
        run: flutter test

  update_version:
    runs-on: ubuntu-latest
    if: gitea.ref == 'refs/heads/development'
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          token: ${{ secrets.BOT_TOKEN }}
          ref: ${{ gitea.ref_name }}

      - name: Increment version number
        uses: stikkyapp/update-pubspec-version@v2
        with:
          strategy: 'patch'
          path: './pubspec.yaml'

      - name: Commit version update
        env:
          GITEA_TOKEN: ${{ secrets.BOT_TOKEN }}
        run: |
          git config --global user.name "Gitea Actions [bot]"
          git config --global user.email "actions@yannick-weigert.de"
          git config pull.rebase false
          git pull origin ${{ gitea.ref_name }}
          git add pubspec.yaml
          git commit -m "Updated version number [skip ci]"
          git push origin HEAD:${{ gitea.ref_name }}

  generate_licenses:
    runs-on: ubuntu-latest
    needs: update_version
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          token: ${{ secrets.BOT_TOKEN }}
          ref: ${{ gitea.ref_name }}

      # Required for Flutter action
      - name: Install jq
        run: |
          apt-get update
          apt-get install -y jq 

      - name: Set up Flutter
        uses: subosito/flutter-action@v2
        with:
          channel: stable
          flutter-version: 3.38.6

      - name: Get dependencies
        run: |
          git config --global --add safe.directory /opt/hostedtoolcache/flutter/stable-3.38.6-x64
          flutter pub get

      - name: Generate oss_licenses.dart
        run: flutter pub run dart_pubspec_licenses:generate -o lib/presentation/views/main_menu/settings_view/licenses/oss_licenses.dart

      - name: Commit license update
        env:
          GITEA_TOKEN: ${{ secrets.BOT_TOKEN }}
        run: |
          if [ -n "$(git status --porcelain lib test)" ]; then
            git config --global user.name "Gitea Actions [bot]"
            git config --global user.email "actions@yannick-weigert.de"
            git config pull.rebase false
            git pull origin ${{ gitea.ref_name }}
            git add lib test
            git commit -m "Updated licenses [skip ci]"
            git push origin HEAD:${{ gitea.ref_name }}
          else
            echo "No changes to commit"
          fi

  format:
    runs-on: ubuntu-latest
    needs: [update_version, generate_licenses]
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      # Required for Flutter action
      - name: Install jq
        run: |
          apt-get update
          apt-get install -y jq 

      - name: Set up Flutter
        uses: subosito/flutter-action@v2
        with:
          channel: stable
          flutter-version: 3.38.6

      - name: Get dependencies
        run: |
          git config --global --add safe.directory /opt/hostedtoolcache/flutter/stable-3.38.6-x64
          flutter pub get

      - name: Check code format
        id: check_format
        continue-on-error: true
        run: flutter analyze lib test

      - name: Format code
        if: steps.check_format.outcome == 'failure'
        env:
          GITEA_TOKEN: ${{ secrets.BOT_TOKEN }}
        run: |
          git fetch origin ${{ gitea.ref_name }}
          git checkout ${{ gitea.ref_name }}
          
          dart fix --apply lib
          dart fix --apply test
          
          if [ -n "$(git status --porcelain lib test)" ]; then
            git config --global user.name "Gitea Actions [bot]"
            git config --global user.email "actions@yannick-weigert.de"
            git config pull.rebase false
            git pull origin ${{ gitea.ref_name }}
            git add lib test
            git commit -m "Auto-format code [skip ci]"
            git push origin HEAD:${{ gitea.ref_name }}
          else
            echo "No changes to commit"
          fi

      - name: Verify format
        run: flutter analyze lib test