# It has a design constraint of requiring no flake inputs as we're already
# using npins.
{
  description = "Specialized set of Nix modules for generating and applying themes.";

  outputs = { ... }:
    let
      sources = import ./npins;
      systems = [
        "x86_64-linux"
        "aarch64-linux"
      ];
      eachSystem =
        systems: f:
        let
          # Merge together the outputs for all systems.
          op =
            attrs: system:
            let
              ret = f system;
              op =
                attrs: key:
                attrs
                // {
                  ${key} = (attrs.${key} or { }) // {
                    ${system} = ret.${key};
                  };
                };
            in
            builtins.foldl' op attrs (builtins.attrNames ret);
        in
        builtins.foldl' op { } (
          systems
          # add the current system if --impure is used
          ++ (
            if builtins ? currentSystem then
              if builtins.elem builtins.currentSystem systems then [ ] else [ builtins.currentSystem ]
            else
              [ ]
          )
        );
    in eachSystem systems
      (system: let
        tests = branch: import ./tests { inherit branch system; };
      in {
        devShells.default =
          import ./shell.nix { pkgs = import sources.nixos-stable { inherit system; }; };

        checks = {
          bahaghariLibStable = (tests "stable").libTestPkg;
          bahaghariLibUnstable = (tests "unstable").libTestPkg;
        };
      }) // import ./default.nix { };
}
