---
name: CI-Flatpak
permissions:
  contents: read

on:
  workflow_call:
    inputs:
      release_commit:
        required: true
        type: string
      release_version:
        required: true
        type: string

jobs:
  build_linux_flatpak:
    name: ${{ matrix.arch }}
    env:
      APP_ID: dev.lizardbyte.app.Sunshine
      NODE_VERSION: "20"
      PLATFORM_VERSION: "23.08"
    runs-on: ${{ matrix.runner }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - arch: x86_64
            runner: ubuntu-22.04
          - arch: aarch64
            runner: ubuntu-22.04-arm
    steps:
      - name: More space
        if: matrix.arch == 'x86_64'
        uses: LizardByte/actions/actions/more_space@v2025.907.21827
        with:
          analyze-space-savings: true
          clean-all: true

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

      - name: Setup node
        id: node
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}

      - name: Install npm dependencies
        run: npm install --package-lock-only

      - name: Debug package-lock.json
        run: cat package-lock.json

      - name: Setup python
        id: python
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'

      - name: Setup Dependencies Linux Flatpak
        run: |
          python -m pip install ./packaging/linux/flatpak/deps/flatpak-builder-tools/node

          sudo apt-get update -y
          sudo apt-get install -y \
            cmake \
            flatpak

          sudo su "$(whoami)" -c "flatpak --user remote-add --if-not-exists flathub \
            https://flathub.org/repo/flathub.flatpakrepo
          "

          sudo su "$(whoami)" -c "flatpak --user install -y flathub \
            org.flatpak.Builder \
            org.freedesktop.Platform/${{ matrix.arch }}/${PLATFORM_VERSION} \
            org.freedesktop.Sdk/${{ matrix.arch }}/${PLATFORM_VERSION} \
            org.freedesktop.Sdk.Extension.node${NODE_VERSION}/${{ matrix.arch }}/${PLATFORM_VERSION} \
          "

          flatpak run org.flatpak.Builder --version

      - name: flatpak node generator
        # https://github.com/flatpak/flatpak-builder-tools/blob/master/node/README.md
        run: flatpak-node-generator npm package-lock.json

      - name: Debug generated-sources.json
        run: cat generated-sources.json

      - name: Cache Flatpak build
        uses: actions/cache@v4
        with:
          path: ./build/.flatpak-builder
          key: flatpak-${{ matrix.arch }}-${{ github.sha }}
          restore-keys: |
            flatpak-${{ matrix.arch }}-

      - name: Configure Flatpak Manifest
        env:
          BRANCH: ${{ github.head_ref }}
        run: |
          # variables for manifest
          branch="${{ env.BRANCH }}"
          build_version=${{ inputs.release_version }}
          commit=${{ inputs.release_commit }}

          # check the branch variable
          if [ -z "$branch" ]
          then
            echo "This is a PUSH event"
            branch=${{ github.ref_name }}
            clone_url=${{ github.event.repository.clone_url }}
          else
            echo "This is a PR event"
            clone_url=${{ github.event.pull_request.head.repo.clone_url }}
          fi
          echo "Branch: ${branch}"
          echo "Commit: ${commit}"
          echo "Clone URL: ${clone_url}"

          export BRANCH=${branch}
          export BUILD_VERSION=${build_version}
          export CLONE_URL=${clone_url}
          export COMMIT=${commit}

          mkdir -p build
          mkdir -p artifacts

          cmake -DGITHUB_CLONE_URL=${clone_url} \
            -B build \
            -S . \
            -DSUNSHINE_CONFIGURE_FLATPAK_MAN=ON \
            -DSUNSHINE_CONFIGURE_ONLY=ON

      - name: Debug Manifest
        working-directory: build
        run: cat "${APP_ID}.yml"

      - name: Build Linux Flatpak
        working-directory: build
        run: |
          echo "::add-matcher::.github/matchers/gcc-strip3.json"
          sudo su "$(whoami)" -c "flatpak run org.flatpak.Builder \
            --arch=${{ matrix.arch }} \
            --force-clean \
            --repo=repo \
            --sandbox \
            --stop-at=cuda build-sunshine ${APP_ID}.yml"
          cp -r .flatpak-builder copy-of-flatpak-builder
          sudo su "$(whoami)" -c "flatpak run org.flatpak.Builder \
            --arch=${{ matrix.arch }} \
            --force-clean \
            --repo=repo \
            --sandbox \
            build-sunshine ${APP_ID}.yml"
          rm -rf .flatpak-builder
          mv copy-of-flatpak-builder .flatpak-builder
          sudo su "$(whoami)" -c "flatpak build-bundle \
            --arch=${{ matrix.arch }} \
            ./repo \
            ../artifacts/sunshine_${{ matrix.arch }}.flatpak ${APP_ID}"
          sudo su "$(whoami)" -c "flatpak build-bundle \
            --runtime \
            --arch=${{ matrix.arch }} \
            ./repo \
            ../artifacts/sunshine_debug_${{ matrix.arch }}.flatpak ${APP_ID}.Debug"
          echo "::remove-matcher owner=gcc-strip3::"

      - name: Lint Flatpak
        working-directory: build
        run: |
          exceptions_file="${{ github.workspace }}/packaging/linux/flatpak/exceptions.json"

          echo "Linting flatpak manifest"
          flatpak run --command=flatpak-builder-lint org.flatpak.Builder \
            --exceptions \
            --user-exceptions "${exceptions_file}" \
            manifest \
            "${APP_ID}.yml"

          echo "Linting flatpak repo"
          # TODO: add arg
          # --mirror-screenshots-url=https://dl.flathub.org/media \
          flatpak run --command=flatpak-builder-lint org.flatpak.Builder \
            --exceptions \
            --user-exceptions "${exceptions_file}" \
            repo \
            repo

      - name: Package Flathub repo archive
        # copy files required to generate the Flathub repo
        if: matrix.arch == 'x86_64'
        run: |
          mkdir -p flathub/modules
          cp "./build/generated-sources.json" "./flathub/"
          cp "./build/package-lock.json" "./flathub/"
          cp "./build/${APP_ID}.yml" "./flathub/"
          cp "./build/${APP_ID}.metainfo.xml" "./flathub/"
          cp "./packaging/linux/flatpak/README.md" "./flathub/"
          cp "./packaging/linux/flatpak/flathub.json" "./flathub/"
          cp -r "./packaging/linux/flatpak/modules/." "./flathub/modules/"
          # submodules will need to be handled in the workflow that creates the PR

          # create the archive
          tar -czf ./artifacts/flathub.tar.gz -C ./flathub .

      - name: Upload Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build-Linux-Flatpak-${{ matrix.arch }}
          path: artifacts/
          if-no-files-found: error
