## See NIX.md for help getting started with Nix

{
  description = "Software to simulate heat transfer for additive manufacturing";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
    utils.url   = "github:numtide/flake-utils";
  };

  outputs = inputs @ { self, utils, ... }: utils.lib.eachDefaultSystem (system: rec {
    config = rec {
      pkgs = import inputs.nixpkgs {
        inherit system;
        inherit (import ./nix/nixpkgs/config.nix {}) overlays config;
      };
    };

    lib = with config; {
      callPackage = set: pkgs.lib.callPackageWith (pkgs // set);
    };

    derivations = with config; rec {
      callPackage = lib.callPackage libs;

      libs = {
        adiak   = callPackage ./nix/dependencies/adiak   {};
        caliper = callPackage ./nix/dependencies/caliper {};
        arborx  = callPackage ./nix/dependencies/arborx  {};
        sundials-mpi = callPackage ./nix/dependencies/sundials-mpi {};

        dealii = let
          versions = rec {
            latest = v962;
            v962   = callPackage ./nix/dependencies/dealii/v9.6.2.nix {
              inherit callPackage;
              trilinos-mpi = pkgs.trilinos-mpi;
            };
            v952   = callPackage ./nix/dependencies/dealii/v9.5.2.nix {
              inherit callPackage;
              trilinos-mpi = pkgs.trilinos-mpi-14_4_0;
            };
          };
        in (versions.latest) // {
          inherit versions;
        };
      };

      adamantine = let
        versions = rec {
          devel = callPackage ./nix/adamantine/common.nix {
            version = self.shortRev or self.dirtyShortRev;
            src     = self;
          };

          stable = v110;

          v110 = callPackage ./nix/adamantine/v1.1.0.nix {
            inherit callPackage;
          };

          v100 = callPackage ./nix/adamantine/v1.0.0.nix {
            inherit callPackage;
            dealii = libs.dealii.versions.v952;
            trilinos-mpi = pkgs.trilinos-mpi-14_4_0;
          };
        };
      in (versions.devel) // {
        inherit versions;
      };
    };

    packages = rec {
      default = adamantine.versions.devel;

      inherit (derivations) adamantine;
    };

    devShells = with config; rec {
      default = adamantineDev;

      adamantineDev = pkgs.mkShell rec {
        name = "adamantine-dev";

        packages = with pkgs; [
          git
          clang-tools
          ninja
        ] ++ pkgs.lib.optionals (pkgs.stdenv.hostPlatform.isLinux) [
          gdb
          cntr
	];

	inputsFrom = [
	  self.outputs.packages.${system}.default
	];

        # For dev, we want to disable hardening.
        hardeningDisable = [
          "bindnow"
          "format"
          "fortify"
          "fortify3"
          "pic"
          "relro"
          "stackprotector"
          "strictoverflow"
        ];

        # Ensure the locales point at the correct archive location.
        LOCALE_ARCHIVE = pkgs.lib.optional (pkgs.stdenv.hostPlatform.isLinux) (
          "${pkgs.glibcLocales}/lib/locale/locale-archive"
        );
      };
    };
  });

  nixConfig = {
    extra-substituters = [ "https://mdfbaam.cachix.org" ];
    extra-trusted-public-keys = [ "mdfbaam.cachix.org-1:WCQinXaMJP7Ny4sMlKdisNUyhcO2MHnPoobUef5aTmQ=" ];
  };
}
