name: "Test"
on:
  pull_request:
  push:
    branches:
      - master

env:
  NIXPKGS_BRANCH: nixpkgs-unstable
  NIX_VERSION: 2.24.11

jobs:
  # The `test-stable` and `install-against-stable` job names are
  # loadā€bearing, despite their inaccuracy on the unstable branch, as
  # they are set as required checks in the repository configuration,
  # which only repository admins can change.
  #
  # TODO: Change them once the repository configuration is updated.

  test-stable:
    runs-on: macos-13
    steps:
    - uses: actions/checkout@v4
    - name: Install Nix
      uses: cachix/install-nix-action@v30
      with:
        install_url: https://releases.nixos.org/nix/nix-${{ env.NIX_VERSION }}/install
    - run: nix flake check --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}

  install-against-stable:
    runs-on: macos-13
    timeout-minutes: 30
    steps:
    - uses: actions/checkout@v4
    - name: Install Nix
      uses: cachix/install-nix-action@v30
      with:
        install_url: https://releases.nixos.org/nix/nix-${{ env.NIX_VERSION }}/install
        nix_path: nixpkgs=channel:${{ env.NIXPKGS_BRANCH }}
    - name: Install channels
      run: |
        nix-channel --add https://nixos.org/channels/${{ env.NIXPKGS_BRANCH }} nixpkgs
        nix-channel --update
    - name: Install nix-darwin
      run: |
        sudo mkdir -p /etc/nix-darwin
        sudo cp modules/examples/simple.nix /etc/nix-darwin/configuration.nix

        nixConfHash=$(shasum -a 256 /etc/nix/nix.conf | cut -d ' ' -f 1)
        etcHostsHash=$(shasum -a 256 /etc/hosts | cut -d ' ' -f 1)
        sudo /usr/bin/sed -i.bak \
          "s/# programs.fish.enable = true;/ \
            imports = [ \
              ({ options, ... }: { \
                nix.settings.access-tokens = [ \"github.com=\${{ secrets.GITHUB_TOKEN }}\" ]; \
                environment.etc.\"nix\/nix.conf\".knownSha256Hashes = [ \"$nixConfHash\" ]; \
                environment.etc.hosts.knownSha256Hashes = [ \"$etcHostsHash\" ]; \
                nix.nixPath = \
                  [ { darwin = \"${PWD////\/}\"; } ] \
                  ++ options.nix.nixPath.default; \
              }) \
            ]; \
          /" \
          /etc/nix-darwin/configuration.nix

        nix run .#darwin-rebuild -- switch \
          -I darwin=. \
          -I darwin-config=/etc/nix-darwin/configuration.nix
    - name: Switch to new configuration
      run: |
        . /etc/bashrc

        sudo /usr/bin/sed -i.bak \
          "s/pkgs.vim/pkgs.hello/" \
          /etc/nix-darwin/configuration.nix

        darwin-rebuild switch

        hello
    - name: Test uninstallation of nix-darwin
      run: |
        # We need to specify `--extra-experimental-features` because `experimental-features` is set by
        # `cachix/install-nix-action` but not by our default config above
        nix run .#darwin-uninstaller \
          --extra-experimental-features "nix-command flakes" \
          --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}
        nix run .#darwin-uninstaller.tests.uninstaller \
          --extra-experimental-features "nix-command flakes" \
          --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}

  install-flake:
    runs-on: macos-13
    timeout-minutes: 30
    steps:
    - uses: actions/checkout@v4
    - name: Install Nix
      uses: cachix/install-nix-action@v30
      with:
        install_url: https://releases.nixos.org/nix/nix-${{ env.NIX_VERSION }}/install
    - name: Install nix-darwin
      run: |
        sudo mkdir -p /etc/nix-darwin
        darwin=$(pwd)
        pushd /etc/nix-darwin
          sudo nix flake init -t $darwin
          nixConfHash=$(shasum -a 256 /etc/nix/nix.conf | cut -d ' ' -f 1)
          etcHostsHash=$(shasum -a 256 /etc/hosts | cut -d ' ' -f 1)
          sudo /usr/bin/sed -i.bak \
            "s/# programs.fish.enable = true;/nix.settings.access-tokens = [ \"github.com=\${{ secrets.GITHUB_TOKEN }}\" ]; environment.etc.\"nix\/nix.conf\".knownSha256Hashes = [ \"$nixConfHash\" ]; environment.etc.hosts.knownSha256Hashes = [ \"$etcHostsHash\" ];/" \
            flake.nix
          sudo /usr/bin/sed -i.bak \
            's/darwinConfigurations."simple"/darwinConfigurations."'$(scutil --get LocalHostName)'"/g' \
            flake.nix
          sudo /usr/bin/sed -i.bak \
            's/nixpkgs.hostPlatform = "aarch64-darwin";/nixpkgs.hostPlatform = "'$(nix eval --expr builtins.currentSystem --impure --raw)'";/' \
            flake.nix
        popd
        nix run .#darwin-rebuild -- switch \
          --override-input nix-darwin . \
          --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}
    - name: Switch to new configuration
      run: |
        . /etc/bashrc

        sudo /usr/bin/sed -i.bak \
          "s/pkgs.vim/pkgs.hello/" \
          /etc/nix-darwin/flake.nix

        darwin-rebuild switch \
          --override-input nix-darwin . \
          --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}

        hello
    - name: Test uninstallation of nix-darwin
      run: |
        nix run .#darwin-uninstaller --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}
        nix run .#darwin-uninstaller.tests.uninstaller --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}