# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: Build Android

run-name: Build Android (${{ inputs.binary-type == 'apk' && '.apk' || '.aab' }}) v${{ inputs.version }}

on:
  workflow_call:
    inputs:
      version:
        description: "Version"
        required: true
        type: string
      binary-type:
        description: "Binary type"
        type: string
        required: true
      flavor:
        description: "Flavor"
        type: string
        required: true
      include-iap:
        type: boolean
        description: Include IAP package
        default: true
      stage-backend:
        type: boolean
        description: Use stage backend
        default: true
  workflow_dispatch:
    inputs:
      version:
        description: "Version"
        required: true
        type: string
      binary-type:
        description: "Binary type"
        type: choice
        required: true
        options:
          - apk
          - appbundle
      flavor:
        description: "Flavor"
        type: choice
        required: true
        options:
          - dev
          - prod
        default: dev
      include-iap:
        type: boolean
        description: Include IAP package
        default: true
      stage-backend:
        type: boolean
        description: Use stage backend
        default: true

env:
  BUILD_ARGS: --release --flavor ${{ inputs.flavor }} -t lib/main_${{ inputs.flavor }}.dart
  BUILD_APK_PATH: build/app/outputs/flutter-apk/app-${{ inputs.flavor }}-release.apk
  BUILD_AAB_PATH: build/app/outputs/bundle/${{ inputs.flavor }}Release/app-${{ inputs.flavor }}-release.aab
  RELEASE_NOTES_ARTIFACT_NAME: release_notes_en_${{ inputs.version }}
  RELEASE_NOTES_PATH: "assets/release_notes"

jobs:
  build-android:
    name: Build ${{ inputs.binary-type == 'apk' && '.apk' || '.aab' }}
    runs-on: macos-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Connect private iap package
        uses: webfactory/ssh-agent@v0.8.0
        if: ${{ inputs.include-iap }}
        with:
          ssh-private-key: ${{ secrets.M3_LIGHTMETER_IAP_KEY }}

      - name: Override iap package with stub
        if: ${{ !inputs.include-iap }}
        run: bash ./.github/scripts/stub_iap.sh

      - uses: actions/setup-java@v3
        with:
          distribution: "zulu"
          java-version: "11"

      - name: Restore Android keystore .jsk and .properties files
        run: |
          bash .github/scripts/restore_from_base64.sh "${{ secrets.KEYSTORE_PROPERTIES }}" "android/key.properties"
          bash .github/scripts/restore_from_base64.sh "${{ secrets.KEYSTORE }}" "android/app/keystore.jks"

      - name: Restore google-services.json
        run: bash .github/scripts/restore_from_base64.sh "${{ secrets.GOOGLE_SERVICES_JSON_ANDROID }}" "android/app/google-services.json"

      - name: Restore firebase_options.dart
        run: bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_OPTIONS }}" "lib/firebase_options.dart"

      - name: Restore constants.dart
        env:
          CONSTANTS: ${{inputs.stage-backend && secrets.CONSTANTS_STAGE || secrets.CONSTANTS }}
        run: bash .github/scripts/restore_from_base64.sh "${{ env.CONSTANTS }}" "lib/constants.dart"

      - name: Increment build number & replace version number
        run: bash ./.github/scripts/increment_build_number.sh ${{ github.event.inputs.version }}

      - name: Download release notes
        continue-on-error: true
        uses: actions/download-artifact@v3
        with:
          name: ${{ env.RELEASE_NOTES_ARTIFACT_NAME }}
          path: ${{ env.RELEASE_NOTES_PATH }}

      - name: Install Flutter
        uses: subosito/flutter-action@v2
        with:
          channel: "stable"
          flutter-version: "3.27.1"

      - name: Prepare flutter project
        run: |
          flutter --version
          flutter pub get
          flutter pub run intl_utils:generate

      - name: Build ${{ inputs.binary-type }}
        run: flutter build ${{ inputs.binary-type }} $BUILD_ARGS

      - name: Upload ${{ inputs.binary-type }} to artifacts
        uses: actions/upload-artifact@v3
        with:
          name: m3_lightmeter_${{ inputs.binary-type }}
          path: ${{ inputs.binary-type == 'apk' && env.BUILD_APK_PATH || env.BUILD_AAB_PATH  }}