# name: build
# on: push
# jobs:
#   checks:
#     uses: nixbuild/nixbuild-action/.github/workflows/ci-workflow.yml@v19
#     with:
#       nix_conf: |
#         allow-import-from-derivation = true
#     secrets:
#       nixbuild_token: ${{ secrets.nixbuild_token }}


name: "build"
on:
  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@v6

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

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


  build-matrix:
    needs: [ "path-filter" ]
    if: needs.path-filter.outputs.changed == 'true'
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
      - 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
      - name: Setup Caching
        uses: cachix/cachix-action@v17
        with:
          name: selfhostblocks
          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
      - name: Generate Matrix
        id: generate-matrix
        run: |
          set -euox pipefail

          nix flake show --allow-import-from-derivation --json \
              | jq -c '.["checks"]["x86_64-linux"] | keys' > .output

          cat .output

          echo dynamic_list="$(cat .output)" >> "$GITHUB_OUTPUT"
    outputs:
      check: ${{ steps.generate-matrix.outputs.dynamic_list }}

  manual:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
      - 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
      - name: Setup Caching
        uses: cachix/cachix-action@v17
        with:
          name: selfhostblocks
          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
      - name: Build
        run: |
          nix \
            --print-build-logs \
            --option keep-going true \
            --show-trace \
            build .#manualHtml

  tests:
    runs-on: ubuntu-latest
    needs: [ "build-matrix" ]
    strategy:
      fail-fast: false
      matrix:
        check: ${{ fromJson(needs.build-matrix.outputs.check) }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
      - 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
      - name: Setup Caching
        uses: cachix/cachix-action@v17
        with:
          name: selfhostblocks
          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
      - name: Build
        run: |
          echo "resultPath=$(nix eval .#checks.x86_64-linux.${{ matrix.check }} --raw)" >> $GITHUB_ENV
          nix build --print-build-logs --show-trace .#checks.x86_64-linux.${{ matrix.check }}
      - name: Upload Build Result
        uses: actions/upload-artifact@v7
        if: always() && startsWith(matrix.check, 'vm_')
        with:
          name: ${{ matrix.check }}
          path: ${{ env.resultPath }}/trace/*
          overwrite: true
          if-no-files-found: ignore

  results:
    name: Final Results
    runs-on: ubuntu-latest
    needs: [ manual, tests ]
    if: '!cancelled()'
    steps:
      - run: |
          result="${{ needs.manual.result }}"
          if ! [[ $result == "success" || $result == "skipped" ]]; then
            exit 1
          fi
          result="${{ needs.tests.result }}"
          if ! [[ $result == "success" || $result == "skipped" ]]; then
            exit 1
          fi
          exit 0
