# Copyright © SixtyFPS GmbH <info@slint.dev>
# SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0

name: CI

on:
    workflow_dispatch:
    workflow_call:
      secrets:
        CLOUDFLARE_API_TOKEN:
          required: true
        CLOUDFLARE_ACCOUNT_ID:
          required: true
        CLOUDFLARE_API_TOKEN_2:
          required: true
        CLOUDFLARE_ACCOUNT_ID_2:
          required: true
        ANDROID_KEYSTORE_PASSWORD:
          required: true
        ANDROID_KEYSTORE_BASE64:
          required: true
        READ_WRITE_PRIVATE_KEY:
          required: true

env:
    MACOSX_DEPLOYMENT_TARGET: "11.0"
    SLINT_COMPILER_DENY_WARNINGS: 1

jobs:
    files-changed:
      runs-on: ubuntu-latest
      timeout-minutes: 1
      permissions:
        pull-requests: read
      outputs:
        slint: ${{ steps.filter.outputs.slint }}
        figma_inspector : ${{ steps.filter.outputs.figma_inspector }}
        material_components : ${{ steps.filter.outputs.material_components }}
        safety_docs : ${{ steps.filter.outputs.safety_docs }}
        internal : ${{ steps.filter.outputs.internal }}
        api_cpp : ${{ steps.filter.outputs.api_cpp }}
        api_python : ${{ steps.filter.outputs.api_python }}
        api_node : ${{ steps.filter.outputs.api_node }}
        api_rs : ${{ steps.filter.outputs.api_rs }}
        tests : ${{ steps.filter.outputs.tests }}
        examples : ${{ steps.filter.outputs.examples }}
        examples_mcu : ${{ steps.filter.outputs.examples_mcu }}
        vsce : ${{ steps.filter.outputs.vsce }}
        slintpad : ${{ steps.filter.outputs.slintpad }}
        updater_test : ${{ steps.filter.outputs.updater_test }}
        servo_example : ${{ steps.filter.outputs.servo_example }}
        bevy_examples : ${{ steps.filter.outputs.bevy_examples }}
        rust_files : ${{ steps.filter.outputs.rust_files }}
      steps:
        - uses: actions/checkout@v6
        - uses: dorny/paths-filter@v4
          id: filter
          with:
            token: ${{ github.token }}
            filters: .github/ci_path_filters.yaml

    build_and_test:
        needs: files-changed
        if: needs.files-changed.outputs.slint == 'true' || needs.files-changed.outputs.examples == 'true'
        strategy:
            matrix:
                include:
                    - os: ubuntu-22.04
                      name: "Ubuntu 22.04 beta"
                      rust_version: "beta"
                      save_if: ${{ github.ref == 'refs/heads/master' }}
                      extra_args: "--exclude plotter"
                    - os: windows-2022
                      name: "Windows 2022 1.92"
                      rust_version: "1.92"
                      save_if: ${{ github.ref == 'refs/heads/master' }}
                      extra_args: "--exclude ffmpeg --exclude gstreamer-player"
                    - os: macos-14
                      name: "MacOS 14 stable"
                      rust_version: "stable"
                      save_if: ${{ github.ref == 'refs/heads/master' }}
                      extra_args: "--exclude ffmpeg --exclude gstreamer-player"
        uses: ./.github/workflows/build_and_test_reusable.yaml
        with:
            os: ${{ matrix.os }}
            name: build_and_test ${{ matrix.name }}
            rust_version: ${{ matrix.rust_version }}
            extra_args: ${{ matrix.extra_args }} --exclude material-gallery
            save_if: ${{ matrix.save_if }}

    # For changes to Slint internals, do a quick test on Linux for Node.js only.
    node_test_linux:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.api_node == 'true' || needs.files-changed.outputs.tests == 'true'
        uses: ./.github/workflows/node_test_reusable.yaml
        with:
          name: "Node.js Linux"
          os: "ubuntu-22.04"

    node_test_macos:
        needs: files-changed
        if: needs.files-changed.outputs.api_node == 'true' || needs.files-changed.outputs.tests == 'true'
        uses: ./.github/workflows/node_test_reusable.yaml
        with:
          name: "Node.js macOS"
          os: "macos-14"

    node_test_windows:
        needs: files-changed
        if: needs.files-changed.outputs.api_node == 'true' || needs.files-changed.outputs.tests == 'true'
        uses: ./.github/workflows/node_test_reusable.yaml
        with:
          name: "Node.js Windows"
          os: "windows-2022"

    # For changes to Slint internals, do a quick test on Linux for Python only.
    python_test_linux:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.api_python == 'true' || needs.files-changed.outputs.tests == 'true'
        uses: ./.github/workflows/python_test_reusable.yaml
        with:
          name: "Python Linux"
          os: "ubuntu-22.04"
    python_test_macos:
        needs: files-changed
        if: needs.files-changed.outputs.api_python == 'true' || needs.files-changed.outputs.tests == 'true'
        uses: ./.github/workflows/python_test_reusable.yaml
        with:
          name: "Python macOS"
          os: "macos-14"
    python_test_windows:
        needs: files-changed
        if: needs.files-changed.outputs.api_python == 'true' || needs.files-changed.outputs.tests == 'true'
        uses: ./.github/workflows/python_test_reusable.yaml
        with:
          name: "Python Windows"
          os: "windows-2022"

    cpp_test_driver:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.api_cpp == 'true' || needs.files-changed.outputs.tests == 'true'
        env:
            DYLD_FRAMEWORK_PATH: /Users/runner/work/slint/Qt/5.15.2/clang_64/lib
            QT_QPA_PLATFORM: offscreen
            RUSTFLAGS: -D warnings
            CARGO_INCREMENTAL: false
            RUST_BACKTRACE: 1
            CARGO_PROFILE_DEV_DEBUG: 0
        strategy:
            matrix:
                include:
                    - os: ubuntu-22.04
                      rust_version: "1.88"
                    - os: macos-14
                      rust_version: beta
                    - os: windows-2022
                      rust_version: stable
        runs-on: ${{ matrix.os }}

        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/install-linux-dependencies
              with:
                  force-gcc-10: true
            - name: Install Qt
              if: runner.os == 'Linux'
              uses: jurplel/install-qt-action@v4
              with:
                  version: "5.15.2"
                  cache: true
            - name: Set default style
              if: runner.os != 'Windows'
              run: echo "SLINT_STYLE=native" >> $GITHUB_ENV
            - name: Set default style
              if: runner.os == 'Windows'
              run: |
                  echo "SLINT_STYLE=fluent" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
                  echo "SLINT_NO_QT=1" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
            - uses: ./.github/actions/setup-rust
              with:
                  toolchain: ${{ matrix.rust_version }}
            - name: Run tests
              run: cargo test --verbose -p  test-driver-cpp --features slint-cpp/backend-qt

    cpp_test_driver_32bit:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.api_cpp == 'true' || needs.files-changed.outputs.tests == 'true'
        runs-on: ubuntu-24.04
        env:
            SLINT_NO_QT: 1
            RUSTFLAGS: -D warnings
            CARGO_INCREMENTAL: false
            RUST_BACKTRACE: 1
            CARGO_PROFILE_DEV_DEBUG: 0
            CARGO_TARGET_I686_UNKNOWN_LINUX_GNU_LINKER: gcc
            PKG_CONFIG_ALLOW_CROSS: 1
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/install-linux-dependencies
            - name: Install 32-bit build dependencies
              run: |
                  sudo dpkg --add-architecture i386
                  sudo apt-get update
                  sudo apt-get install -y gcc-multilib g++-multilib libfontconfig-dev:i386
            - uses: ./.github/actions/setup-rust
              with:
                  target: i686-unknown-linux-gnu
            - name: Run tests
              run: cargo test -p test-driver-cpp --target i686-unknown-linux-gnu --no-default-features

    cpp_cmake:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.api_cpp == 'true' || needs.files-changed.outputs.examples == 'true'
        env:
            DYLD_FRAMEWORK_PATH: /Users/runner/work/slint/Qt/6.5.1/clang_64/lib
            QT_QPA_PLATFORM: offscreen
            CARGO_INCREMENTAL: false
            RUST_BACKTRACE: 1
            CARGO_PROFILE_DEV_DEBUG: 0
            SLINT_EMIT_DEBUG_INFO: 1
        strategy:
            matrix:
                include:
                    - os: macos-14
                      rust_version: "1.88"
                    - os: windows-2022
                      rust_version: "nightly"
                    - os: ubuntu-22.04
                      rust_version: "stable"
        runs-on: ${{ matrix.os }}
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/install-linux-dependencies
              with:
                  force-gcc-10: true
            - name: Install Qt
              uses: jurplel/install-qt-action@v4
              with:
                  version: 6.5.1
                  cache: true
            - uses: ./.github/actions/setup-rust
            - uses: ilammy/msvc-dev-cmd@v1
            - name: Select MSVC (windows)
              if: matrix.os == 'windows-2022'
              run: |
                  echo "CC=cl.exe" >> $GITHUB_ENV
                  echo "CXX=cl.exe" >> $GITHUB_ENV
            - name: Enable test coverage for resource embedding in C++ when building examples
              if: matrix.os == 'ubuntu-22.04'
              run: |
                  echo "SLINT_EMBED_RESOURCES=true" >> $GITHUB_ENV
            - name: C++ Build
              uses: lukka/run-cmake@v3.4
              with:
                  cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
                  cmakeListsTxtPath: CMakeLists.txt
                  cmakeAppendedArgs: "-DSLINT_BUILD_TESTING=ON -DSLINT_BUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Debug -DSLINT_FEATURE_RENDERER_SKIA=ON -DSLINT_FEATURE_BACKEND_QT=ON -DSLINT_FEATURE_EXPERIMENTAL=ON -DSLINT_FEATURE_TESTING=ON"
                  buildDirectory: ${{ runner.workspace }}/cppbuild
                  buildWithCMakeArgs: "--config Debug"
            - name: ctest
              working-directory: ${{ runner.workspace }}/cppbuild
              run: ctest --verbose -C Debug
            - name: cpack
              working-directory: ${{ runner.workspace }}/cppbuild
              run: cmake --build . --config Debug --target package
            - name: "Create C++ packages artifact"
              uses: actions/upload-artifact@v7
              with:
                  name: cpp_bin-${{ matrix.os }}
                  path: ${{ runner.workspace }}/cppbuild/Slint-cpp-*

    cpp_package_test:
        needs: [cpp_cmake]
        runs-on: ubuntu-22.04
        env:
            QT_QPA_PLATFORM: offscreen
            CARGO_INCREMENTAL: false
            CARGO_PROFILE_DEV_DEBUG: 0
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/install-linux-dependencies
              with:
                  force-gcc-10: true
            - name: Install Qt (Ubuntu)
              uses: jurplel/install-qt-action@v4
              with:
                  version: 6.5.1
                  cache: true
            - uses: actions/download-artifact@v8
              with:
                  name: cpp_bin-ubuntu-22.04
                  path: cpp-package
            - name: unpack package
              run: |
                  mkdir package
                  tar xvf cpp-package/Slint-cpp-*.tar.gz -C package --strip-components=1
                  echo "CMAKE_PREFIX_PATH=`pwd`/package" >> $GITHUB_ENV
            # Build the examples with a config different than the package (which is debug)
            - name: Build examples
              uses: lukka/run-cmake@v3.4
              with:
                  cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
                  cmakeListsTxtPath: examples/CMakeLists.txt
                  cmakeAppendedArgs: "-DCMAKE_BUILD_TYPE=Release -DSLINT_FEATURE_INTERPRETER=1 -DSLINT_FEATURE_BACKEND_QT=1"
                  buildDirectory: ${{ runner.workspace }}/examples/build
                  buildWithCMakeArgs: "--config Release"

    vsce_build_test:
        needs: files-changed
        if: needs.files-changed.outputs.vsce == 'true'
        runs-on: ubuntu-22.04
        steps:
            - uses: actions/checkout@v6
            - uses: pnpm/action-setup@v5.0.0
              with:
                version: 10.29.3
            - uses: Swatinem/rust-cache@v2
              with:
                key: "vsce_1" # increment this to bust the cache if needed
            - uses: ./.github/actions/install-linux-dependencies
            - uses: actions/setup-node@v6
              with:
                  node-version: 24
                  package-manager-cache: false
            - name: Install wasm-pack
              run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
            - name: Fake slint-lsp build
              run: |
                  mkdir -p target/debug
                  echo 1 > target/debug/slint-lsp
            - name: Run pnpm install
              working-directory: editors/vscode
              run: pnpm install --frozen-lockfile
            - name: vscode prebuild
              working-directory: editors/vscode
              run: pnpm vscode:prepublish
            - name: Build VS Code extension
              working-directory: editors/vscode
              run: pnpm local-package
            - name: Typescript syntax check # has to run after the build as it depends on the wasm
              working-directory: editors/vscode
              run: pnpm type-check
            - name: Check tmGrammar
              working-directory: editors/vscode
              run: pnpm test_grammar

    # test to compile the mcu backend for the arm target (no_std)
    mcu:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.examples_mcu == 'true' || needs.files-changed.outputs.api_rs == 'true'
        env:
            SLINT_FONT_SIZES: 8,11,10,12,13,14,15,16,18,20,22,24,32
            RUSTFLAGS: --cfg slint_int_coord -D warnings
            CARGO_PROFILE_DEV_DEBUG: 0
            CARGO_PROFILE_RELEASE_OPT_LEVEL: s
        runs-on: ubuntu-22.04
        strategy:
            matrix:
                include:
                    - feature: pico-st7789
                      target: thumbv6m-none-eabi
                    - feature: pico2-st7789
                      target: thumbv8m.main-none-eabihf
                    - feature: pico2-touch-lcd-2-8
                      target: thumbv8m.main-none-eabihf
                    - feature: stm32h735g
                      target: thumbv7em-none-eabihf
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/setup-rust
              with:
                  target: ${{matrix.target}}
            - name: Check
              run: cargo check --target=${{matrix.target}} -p printerdemo_mcu --no-default-features --features=mcu-board-support/${{matrix.feature}} --release

    # test to compile the mcu backend for the arm target (no_std) using embassy
    mcu-embassy:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.examples_mcu == 'true' || needs.files-changed.outputs.api_rs == 'true'
        env:
            SLINT_FONT_SIZES: 8,11,10,12,13,14,15,16,18,20,22,24,32
            RUSTFLAGS: --cfg slint_int_coord -D warnings
            CARGO_PROFILE_DEV_DEBUG: 0
            CARGO_PROFILE_RELEASE_OPT_LEVEL: s
        runs-on: ubuntu-22.04
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/setup-rust
              with:
                  target: thumbv8m.main-none-eabihf
            - name: Check
              working-directory: examples/mcu-embassy
              run: cargo check --bin ui_mcu --target=thumbv8m.main-none-eabihf --no-default-features --features="mcu-embassy/mcu" --release

#    mcu_esp:
#        env:
#            RUSTFLAGS: -D warnings
#        runs-on: ubuntu-22.04
#        steps:
#            - uses: actions/checkout@v6
#            - uses: dtolnay/rust-toolchain@stable
#            - uses: esp-rs/xtensa-toolchain@v1.6
#              with:
#                  default: true
#                  buildtargets: esp32
#                  ldproxy: false
#                  # version pinned until new version of esp-hal with https://github.com/esp-rs/esp-hal/pull/2615/
#                  version: 1.82.0
#            - uses: Swatinem/rust-cache@v2
#            - name: S3Box
#              run: cargo +esp check -p printerdemo_mcu --target xtensa-esp32s3-none-elf --no-default-features --features=mcu-board-support/esp32-s3-box  --config examples/mcu-board-support/esp32_s3_box/cargo-config.toml --release

    ffi_32bit_build:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.api_cpp == 'true'
        runs-on: ubuntu-22.04
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/setup-rust
              with:
                  target: armv7-unknown-linux-gnueabihf
            - uses: baptiste0928/cargo-install@v3
              with:
                  crate: cross
            - name: Check
              run: cross check --target=armv7-unknown-linux-gnueabihf -p slint-cpp --no-default-features --features=testing,interpreter,std

    docs:
        needs: files-changed
        if: needs.files-changed.outputs.slint == 'true'
        uses: ./.github/workflows/build_docs.yaml
        secrets:
          READ_WRITE_PRIVATE_KEY: ${{ secrets.READ_WRITE_PRIVATE_KEY }}
        with:
          release: false
          app-id: ${{ vars.READ_WRITE_APP_ID }}

    slintpad:
        needs: files-changed
        if: needs.files-changed.outputs.slintpad == 'true'
        uses: ./.github/workflows/wasm_editor_and_interpreter.yaml

    wasm_demo:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.examples == 'true' || needs.files-changed.outputs.api_rs == 'true'
        uses: ./.github/workflows/wasm_demos.yaml
        with:
          build_artifacts: false

    tree-sitter:
        needs: files-changed
        if: needs.files-changed.outputs.slint == 'true'
        uses: ./.github/workflows/tree_sitter.yaml
        with:
            latest: false
            tag: "v0.26.5"

    # Checkout a old version of the tests and example, then run the slint-updater on them
    # and check that it worked with the interpreter test.
    updater_test:
        needs: files-changed
        if: needs.files-changed.outputs.updater_test == 'true'
        env:
            SLINT_NO_QT: 1
            CARGO_INCREMENTAL: false
            RUST_BACKTRACE: 1
            CARGO_PROFILE_DEV_DEBUG: 0
        strategy:
            matrix:
                from_version: ["0.3.0"]
        runs-on: ubuntu-22.04
        steps:
            - uses: actions/checkout@v6
              with:
                  fetch-depth: 0
            - uses: ./.github/actions/install-linux-dependencies
            - uses: ./.github/actions/setup-rust
            - name: Checkout old version
              run: |
                  git checkout v${{ matrix.from_version }} --no-overlay -- examples
                  git checkout v${{ matrix.from_version }} --no-overlay -- tests/cases
                  git checkout v${{ matrix.from_version }} --no-overlay -- tests/helper_components
                  # Remove examples and demos from the workspace because they may no longer exist or their Cargo.toml might prevent the build of the updater
                  sed -i "/examples/d" Cargo.toml
                  sed -i "/demos/d" Cargo.toml
            - name: "Commit old checkout"
              run: |
                  git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com"
                  git config --global user.name "${GITHUB_ACTOR}"
                  git commit -a -m "REVERT TESTS TO v${{ matrix.from_version }}"
            - name: run the updater
              run: |
                  cargo run -p slint-updater -- -i examples/*/*.slint
                  cargo run -p slint-updater -- -i examples/*/*/*.slint
                  cargo run -p slint-updater -- -i tests/cases/*.slint
                  cargo run -p slint-updater -- -i tests/cases/*/*.slint
            - name: Show the diff
              run: git diff
            - name: test
              # Skip a few tests that rely on private renamed properties.
              # Skip the tests which makes two way binding to output property (these are warning in previous version)
              # Skip the test that use impure functions in property bindings (this is also warning in previous version)
              # Skip the example that did not exist or that are broken
              # Skip the path layout related tests as the element has been removed
              # Skip the booker as it use api from the LineEdit that wasn"t meant to be used
              run: |
                  cargo test -p test-driver-interpreter -- \
                            --skip test_interpreter_text_cursor_move \
                            --skip test_interpreter_text_cursor_move_grapheme \
                            --skip test_interpreter_text_cut \
                            --skip test_interpreter_text_select_all \
                            --skip test_interpreter_text_surrogate_cursor \
                            --skip test_interpreter_text_text_change \
                            --skip test_interpreter_crashes_layout_deleted_item \
                            --skip test_interpreter_focus_focus_change_subcompo \
                            --skip test_interpreter_focus_focus_change_through_signal \
                            --skip test_interpreter_globals_alias_to_global \
                            --skip test_interpreter_text_default_color \
                            --skip test_interpreter_crashes_issue1271_set_in_if \
                            --skip test_interpreter_models_assign_equal_model \
                            --skip example_carousel \
                            --skip example_fancy_demo \
                            --skip example_dial \
                            --skip example_fancy_switches \
                            --skip example_sprite_sheet \
                            --skip example_grid_model_rows \
                            --skip example_grid_with_repeated_rows \
                            --skip example_vector_as_grid \
                            --skip example_vlayout \
                            --skip example_flexbox_interactive \
                            --skip test_interpreter_elements_path_fit \
                            --skip test_interpreter_layout_path \
                            --skip test_interpreter_7guis_booker \

    # Test that the formater don't introduce slint compilation error
    fmt_test:
        needs: files-changed
        if: needs.files-changed.outputs.slintpad == 'true' || needs.files-changed.outputs.tests == 'true'
        env:
            SLINT_NO_QT: 1
            CARGO_INCREMENTAL: false
            RUST_BACKTRACE: 1
            CARGO_PROFILE_DEV_DEBUG: 0
            RUSTFLAGS: -D warnings
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/install-linux-dependencies
            - uses: ./.github/actions/setup-rust
            - name: run the formatter
              run: |
                  cargo run -p slint-lsp --no-default-features -- format -i tests/cases/**/*.slint
                  cargo run -p slint-lsp --no-default-features -- format -i examples/**/*.slint
            - name: Show the diff
              run: git diff
            - name: Run the intepreter test to make sure that the test are passing after format
              run: cargo test -p test-driver-interpreter
            - name: "Commit changes"
              run: |
                  git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com"
                  git config --global user.name "${GITHUB_ACTOR}"
                  git commit -a -m "Run slint-lsp format"
            - name: Do another pass to check that it is idempotent
              run: |
                  cargo run -p slint-lsp --no-default-features -- format -i tests/cases/**/*.slint
                  cargo run -p slint-lsp --no-default-features -- format -i examples/**/*.slint
                  git diff --exit-code

    esp-idf-quick:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.api_cpp == 'true' || needs.files-changed.outputs.examples == 'true'
        runs-on: ubuntu-22.04
        container: espressif/idf:release-v5.2
        steps:
            - name: Fix up pydantic regression (https://github.com/espressif/idf-component-manager/issues/97#issuecomment-3380777944)
              run: |
                  . ${IDF_PATH}/export.sh
                  cd $IDF_PYTHON_ENV_PATH
                  bin/pip install pydantic==2.11.10
            - uses: actions/checkout@v6
            - run: apt-get update && apt-get install -y libfontconfig1-dev
            - uses: dtolnay/rust-toolchain@stable
            - uses: esp-rs/xtensa-toolchain@v1.6
              with:
                  default: true
                  buildtargets: esp32
                  ldproxy: false
            - uses: Swatinem/rust-cache@v2
            - name: Build and Test Printer demo
              shell: bash
              working-directory: demos/printerdemo_mcu/esp-idf
              run: |
                  . ${IDF_PATH}/export.sh
                  idf.py build

    android:
        needs: files-changed
        if: needs.files-changed.outputs.internal == 'true' || needs.files-changed.outputs.api_rs == 'true' || needs.files-changed.outputs.examples == 'true'
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/install-linux-dependencies
            - name: Install Android API level 30
              run: ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager --install "platforms;android-30"
            - name: Cache cargo-apk
              id: cargo-apk-cache
              uses: actions/cache@v5
              with:
                  path: ~/.cargo/bin/cargo-apk
                  key: cargo-apk-cache
            # Only build cargo-apk if not cached
            - uses: dtolnay/rust-toolchain@stable
              if: steps.cargo-apk-cache.outputs.cache-hit != 'true'
            - name: Install cargo-apk
              if: steps.cargo-apk-cache.outputs.cache-hit != 'true'
              run: cargo install cargo-apk

            - uses: ./.github/actions/setup-rust
              with:
                  target: aarch64-linux-android

            - name: Build todo demo
              run: cargo apk build -p todo --target aarch64-linux-android --lib

            - name: Build energy-monitor example
              run: cargo apk build -p energy-monitor --target aarch64-linux-android --lib

            - name: Build printerdemo example
              run: cargo apk build -p printerdemo --target aarch64-linux-android --lib

            - name: Build usecases demo
              run: cargo apk build -p usecases --target aarch64-linux-android --lib

    test-figma-inspector:
        needs: files-changed
        if: needs.files-changed.outputs.figma_inspector == 'true'
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v6
            - uses: actions/setup-node@v6
              with:
                node-version: 24
                package-manager-cache: false
              id: node-install
            - uses: pnpm/action-setup@v5.0.0
              with:
                version: 10.29.3
            - name: Run pnpm install
              working-directory: tools/figma-inspector
              run: pnpm install --frozen-lockfile
            - name: Run build
              working-directory: tools/figma-inspector
              run: pnpm build
            - name: Run tests
              working-directory: tools/figma-inspector
              run: pnpm test
            - name: Type Check
              working-directory: tools/figma-inspector
              run: pnpm type-check
            - name: Build zip
              working-directory: tools/figma-inspector
              run: pnpm zip
            - name: Archive zip
              uses: actions/upload-artifact@v7
              with:
                  name: figma-plugin
                  path: tools/figma-inspector/zip

    material-components:
      needs: files-changed
      if: needs.files-changed.outputs.material_components == 'true'
      permissions:
        contents: read
        deployments: write
      uses: ./.github/workflows/material.yaml
      secrets:
        CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
        CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
        CLOUDFLARE_API_TOKEN_2: ${{ secrets.CLOUDFLARE_API_TOKEN_2 }}
        CLOUDFLARE_ACCOUNT_ID_2: ${{ secrets.CLOUDFLARE_ACCOUNT_ID_2 }}
        ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
        ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}

    safety-docs:
      needs: files-changed
      if: needs.files-changed.outputs.safety_docs == 'true'
      uses: ./.github/workflows/safety_docs.yaml

    servo_example:
        needs: files-changed
        if: needs.files-changed.outputs.servo_example == 'true'
        uses: ./.github/workflows/servo_example.yaml

    bevy_examples:
        needs: files-changed
        if: needs.files-changed.outputs.bevy_examples == 'true'
        uses: ./.github/workflows/bevy_examples.yaml

    clippy:
        needs: files-changed
        if: needs.files-changed.outputs.rust_files == 'true'
        env:
            RUSTFLAGS: -D warnings
            CARGO_INCREMENTAL: false
            CARGO_PROFILE_DEV_DEBUG: 0
        runs-on: ubuntu-22.04
        steps:
            - uses: actions/checkout@v6
            - uses: ./.github/actions/install-linux-dependencies
            - name: Install ffmpeg and alsa (Linux)
              run: sudo apt-get install clang libavcodec-dev libavformat-dev libavutil-dev libavfilter-dev libavdevice-dev libasound2-dev pkg-config
            - name: Install gstreamer and libunwind (Linux)
              run: sudo apt-get install libunwind-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good
            - uses: ./.github/actions/setup-rust
            - name: Run Clippy
              run: ./scripts/run_clippy.sh
