name: Demo

on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - main

jobs:
  path-filter:
    runs-on: ubuntu-latest
    outputs:
      changed: ${{ steps.filter.outputs.any_changed }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v5

      - uses: tj-actions/changed-files@v47
        id: filter
        with:
          files: |
            demo/**
            lib/**
            modules/**
            !modules/**/docs/**
            test/**
            flake.lock
            flake.nix
            .github/workflows/demo.yml
          separator: "\n"

      - env:
          ALL_CHANGED_FILES: ${{ steps.filter.outputs.all_changed_files }}
        run: |
          echo $ALL_CHANGED_FILES

  build:
    needs: [ "path-filter" ]
    if: needs.path-filter.outputs.changed == 'true'
    strategy:
      fail-fast: false
      matrix:
        demo:
          - name:  homeassistant
            flake: basic
          - name:  homeassistant
            flake: ldap

          - name:  nextcloud
            flake: basic
          - name:  nextcloud
            flake: ldap
          - name:  nextcloud
            flake: sso

          - name:  minimal
            flake: minimal
          - name:  minimal
            flake: lowlevel
          - name:  minimal
            flake: sops

    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v5

      - name: Install Nix
        uses: cachix/install-nix-action@v31
        with:
          github_access_token: ${{ secrets.GITHUB_TOKEN }}
          enable_kvm: true
          extra_nix_config: |
            keep-outputs = true
            keep-failed = true

      - uses: cachix/cachix-action@v16
        with:
          name: selfhostblocks
          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'

      - name: Build ${{ matrix.demo.name }} .#${{ matrix.demo.flake }}
        run: |
          cd demo/${{ matrix.demo.name }}
          nix flake update --override-input selfhostblocks ../.. selfhostblocks
          nix \
            --print-build-logs \
            --option keep-going true \
            --show-trace \
            build .#nixosConfigurations.${{ matrix.demo.flake }}.config.system.build.toplevel
          nix \
            --print-build-logs \
            --option keep-going true \
            --show-trace \
            build .#nixosConfigurations.${{ matrix.demo.flake }}.config.system.build.vm

  result:
    runs-on: ubuntu-latest
    needs: [ "build" ]
    if: '!cancelled()'
    steps:
      - run: |
          result="${{ needs.build.result }}"
          if [[ $result == "success" || $result == "skipped" ]]; then
            exit 0
          else
            exit 1
          fi
