---
name: CI-Flatpak
permissions: {}

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
      MATRIX_ARCH: ${{ matrix.arch }}
      NODE_VERSION: "20"
      PLATFORM_VERSION: "24.08"
    permissions:
      contents: read
    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@4125866b7b655a6fe038b0e22a43a4c5d259af79  # v2026.417.35446
        with:
          analyze-space-savings: true
          clean-all: true

      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2
        with:
          submodules: recursive

      - name: Setup node
        id: node
        uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e  # v6.4.0
        with:
          node-version: ${{ env.NODE_VERSION }}

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

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

      - name: Setup python
        id: python
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405  # v6.2.0
        with:
          python-version: '3.14'

      - name: Setup Dependencies Linux Flatpak
        run: |
          python -m pip install ".[flatpak]"

          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: flatpak pip generator
        # generates glad-dependencies.json for PyPI build-time dependencies (e.g. jinja2 for glad)
        run: |
          python \
            ./packaging/linux/flatpak/deps/flatpak-builder-tools/pip/flatpak-pip-generator.py \
            --runtime="org.freedesktop.Sdk//${PLATFORM_VERSION}" \
            --output glad-dependencies \
            --build-only \
            --requirements-file=./third-party/glad/requirements.txt

          # Copy generated pip sources into build dir alongside the manifest
          cp glad-dependencies.json build/

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

      - name: Configure Flatpak Manifest
        env:
          INPUT_RELEASE_VERSION: ${{ inputs.release_version }}
          INPUT_RELEASE_COMMIT: ${{ inputs.release_commit }}
          REPOSITORY_CLONE_URL: ${{ github.event.repository.clone_url }}
        run: |
          # variables for manifest
          branch="${GITHUB_REF}"
          build_version="${INPUT_RELEASE_VERSION}"
          commit="${INPUT_RELEASE_COMMIT}"
          clone_url="${REPOSITORY_CLONE_URL}"

          if [ "${GITHUB_EVENT_NAME}" == "push" ]; then
            echo "This is a PUSH event"
            branch="${GITHUB_REF_NAME}"
          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/glad-dependencies.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@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a  # v7.0.1
        with:
          name: build-Linux-Flatpak-${{ matrix.arch }}
          path: artifacts/
          if-no-files-found: error
