{ description = "niss's silly extra packages";

  outputs = all@{ self, nixpkgs }:
  let
    inherit (nixpkgs.lib) genAttrs optionalAttrs systems defaultTo;
    forAllSystems = genAttrs systems.flakeExposed;


    packagesInDir = dir: names: pkgs:
      let inherit (pkgs) callPackage; in
      genAttrs names (pkg: callPackage ./${dir}/${pkg}.nix {});

    linuxPackages = packagesInDir "apps" [
      "multi-ghc" "basilisk" "isabelle"
      "firefox-esr-alias" "inkscape-xwayland"
    ];

    crossPlatformPackages = packagesInDir "scripts" [ "niss-misc" ];

    fonts = packagesInDir "fonts" [
      "constructium" "fairfax-hd" "kreative-square" "muller"
      "pragmatapro" "teranoptia"
    ];

    haskellExes = pkgs: builtins.mapAttrs
      (name: pkg: pkgs.haskell.lib.justStaticExecutables pkg)
      (packagesInDir "haskell" [ "ips" ] pkgs.haskellPackages);


    makeApp = pkgs: name: exe: {
      inherit name;
      value = {
        type = "app";
        program = "${pkgs.${name}}/bin/${defaultTo name exe}";
      };
    };

    linuxApps = pkgs: builtins.listToAttrs [
      (makeApp pkgs "basilisk" null)
      (makeApp pkgs "isabelle" null)
      (makeApp pkgs "firefox-esr-alias" "firefox-esr")
      (makeApp pkgs "inkscape-xwayland" "inkscape")
    ];


    ifLinux64 = sys: optionalAttrs (sys == "x86_64-linux");

    mkPackages = sys: pkgs:
      ifLinux64 sys (linuxPackages pkgs) //
      crossPlatformPackages pkgs // fonts pkgs //
      haskellExes pkgs;

    mkApps = sys: pkgs: ifLinux64 sys (linuxApps pkgs);
  in {
    packages = forAllSystems (sys: mkPackages sys nixpkgs.legacyPackages.${sys});
    apps     = forAllSystems (sys: mkApps sys nixpkgs.legacyPackages.${sys});
    overlays = forAllSystems (sys: final: prev: mkPackages sys final);
  };
}