name: citra-build

on:
  push:
    branches: [ "*" ]
    tags: [ "*" ]
  pull_request:
    branches: [ master ]

jobs:
  source:
    if: ${{ !github.head_ref }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
      - name: Pack
        run: ./.ci/source.sh
      - name: Upload
        uses: actions/upload-artifact@v4
        with:
          name: source
          path: artifacts/
  linux:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target: ["appimage", "fresh"]
    container:
      image: citraemu/build-environments:linux-${{ matrix.target }}
      options: -u 1001
    env:
      CCACHE_DIR: ${{ github.workspace }}/.ccache
      CCACHE_COMPILERCHECK: content
      CCACHE_SLOPPINESS: time_macros
      OS: linux
      TARGET: ${{ matrix.target }}
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
      - name: Set up cache
        uses: actions/cache@v4
        with:
          path: ${{ env.CCACHE_DIR }}
          key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-${{ matrix.target }}-
      - name: Build
        run: ./.ci/linux.sh
      - name: Pack
        run: ./.ci/pack.sh
        if: ${{ matrix.target == 'appimage' }}
      - name: Upload
        uses: actions/upload-artifact@v4
        if: ${{ matrix.target == 'appimage' }}
        with:
          name: ${{ env.OS }}-${{ env.TARGET }}
          path: artifacts/
  macos:
    runs-on: ${{ (matrix.target == 'x86_64' && 'macos-13') || 'macos-14' }}
    strategy:
      matrix:
        target: ["x86_64", "arm64"]
    env:
      CCACHE_DIR: ${{ github.workspace }}/.ccache
      CCACHE_COMPILERCHECK: content
      CCACHE_SLOPPINESS: time_macros
      OS: macos
      TARGET: ${{ matrix.target }}
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
      - name: Set up cache
        uses: actions/cache@v4
        with:
          path: ${{ env.CCACHE_DIR }}
          key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-${{ matrix.target }}-
      - name: Install tools
        run: brew install ccache ninja
      - name: Build
        run: ./.ci/macos.sh
      - name: Prepare outputs for caching
        run: mv build/bundle $OS-$TARGET
      - name: Cache outputs for universal build
        uses: actions/cache/save@v4
        with:
          path: ${{ env.OS }}-${{ env.TARGET }}
          key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }}
  macos-universal:
    runs-on: macos-14
    needs: macos
    env:
      OS: macos
      TARGET: universal
    steps:
      - uses: actions/checkout@v4
      - name: Download x86_64 build from cache
        uses: actions/cache/restore@v4
        with:
          path: ${{ env.OS }}-x86_64
          key: ${{ runner.os }}-x86_64-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }}
          fail-on-cache-miss: true
      - name: Download ARM64 build from cache
        uses: actions/cache/restore@v4
        with:
          path: ${{ env.OS }}-arm64
          key: ${{ runner.os }}-arm64-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }}
          fail-on-cache-miss: true
      - name: Create universal app
        run: ./.ci/macos-universal.sh
        env:
          ARTIFACTS: ${{ env.OS }}-x86_64 ${{ env.OS }}-arm64
      - name: Pack
        run: ./.ci/pack.sh
      - name: Upload
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.OS }}-${{ env.TARGET }}
          path: artifacts/
  windows:
    runs-on: windows-latest
    strategy:
      matrix:
        target: ["msvc", "msys2"]
    defaults:
      run:
        shell: ${{ (matrix.target == 'msys2' && 'msys2') || 'bash' }} {0}
    env:
      CCACHE_DIR: ${{ github.workspace }}/.ccache
      CCACHE_COMPILERCHECK: content
      CCACHE_SLOPPINESS: time_macros
      OS: windows
      TARGET: ${{ matrix.target }}
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
      - name: Set up cache
        uses: actions/cache@v4
        with:
          path: ${{ env.CCACHE_DIR }}
          key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-${{ matrix.target }}-
      - name: Set up MSVC
        uses: ilammy/msvc-dev-cmd@v1
        if: ${{ matrix.target == 'msvc' }}
      - name: Install extra tools (MSVC)
        run: choco install ccache ninja wget
        if: ${{ matrix.target == 'msvc' }}
      - name: Set up MSYS2
        uses: msys2/setup-msys2@v2
        if: ${{ matrix.target == 'msys2' }}
        with:
          msystem: clang64
          update: true
          install: git make p7zip
          pacboy: >-
            toolchain:p ccache:p cmake:p ninja:p
            qt6-base:p qt6-multimedia:p qt6-multimedia-wmf:p qt6-tools:p qt6-translations:p
      - name: Disable line ending translation
        run: git config --global core.autocrlf input
      - name: Build
        run: ./.ci/windows.sh
      - name: Pack
        run: ./.ci/pack.sh
      - name: Upload
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.OS }}-${{ env.TARGET }}
          path: artifacts/
  android:
    runs-on: ubuntu-latest
    env:
      CCACHE_DIR: ${{ github.workspace }}/.ccache
      CCACHE_COMPILERCHECK: content
      CCACHE_SLOPPINESS: time_macros
      OS: android
      TARGET: universal
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
      - name: Set up cache
        uses: actions/cache@v4
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
            ${{ env.CCACHE_DIR }}
          key: ${{ runner.os }}-android-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-android-
      - name: Set tag name
        run: |
          if [[ "$GITHUB_REF_NAME" =~ ^canary- ]] || [[ "$GITHUB_REF_NAME" =~ ^nightly- ]]; then
              echo "GIT_TAG_NAME=$GITHUB_REF_NAME" >> $GITHUB_ENV
          fi
          echo $GIT_TAG_NAME
      - name: Deps
        run: |
          sudo add-apt-repository -y ppa:theofficialgman/gpu-tools
          sudo apt-get update -y
          sudo apt-get install ccache apksigner -y
      - name: Build
        run: JAVA_HOME=$JAVA_HOME_17_X64 ./.ci/android.sh
        env:
          ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }}
          ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
          ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }}
      - name: Pack
        run: ../../../.ci/pack.sh
        working-directory: src/android/app
        env:
          UNPACKED: 1
      - name: Upload
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.OS }}-${{ env.TARGET }}
          path: src/android/app/artifacts/
  ios:
    runs-on: macos-14
    if: ${{ !startsWith(github.ref, 'refs/tags/') }}
    env:
      CCACHE_DIR: ${{ github.workspace }}/.ccache
      CCACHE_COMPILERCHECK: content
      CCACHE_SLOPPINESS: time_macros
      OS: ios
      TARGET: arm64
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
      - name: Set up cache
        uses: actions/cache@v4
        with:
          path: ${{ env.CCACHE_DIR }}
          key: ${{ runner.os }}-ios-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-ios-
      - name: Install tools
        run: brew install ccache ninja
      - name: Build
        run: ./.ci/ios.sh
  release:
    runs-on: ubuntu-latest
    needs: [windows, linux, macos-universal, android, source]
    if: ${{ startsWith(github.ref, 'refs/tags/') }}
    steps:
      - uses: actions/download-artifact@v4
      - name: Create release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref_name }}
          release_name: ${{ github.ref_name }}
          draft: false
          prerelease: false
      - name: Upload artifacts
        uses: alexellis/upload-assets@0.4.0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          asset_paths: '["./**/*.tar.*","./**/*.AppImage","./**/*.7z","./**/*.zip","./**/*.apk","./**/*.aab"]'
