with builtins;
let
  secrets = import ./secrets.nix;

  # Copied from <nixpkgs/lib>
  removeSuffix = suffix: str:
    let
      sufLen = stringLength suffix;
      sLen = stringLength str;
    in
    if
      sufLen <= sLen && suffix == substring (sLen - sufLen) sufLen str
    then
      substring 0 (sLen - sufLen) str
    else
      str;

in
{

  network.description = "nix-community infra";

  build01 =
    { resources, ... }:
    {
      imports = [
        ./build01/configuration.nix
      ];

      deployment.targetHost = "94.130.143.84";

      deployment.keys.buildkite-token = {
        text = removeSuffix "\n" secrets.buildkite-token;
        user = "buildkite-agent-ci";
        permissions = "0600";
      };

      deployment.keys.buildkite-agent-key = {
        text = secrets.buildkite-agent-key;
        user = "buildkite-agent-ci";
        permissions = "0600";
      };

      deployment.keys."buildkite-agent-key.pub" = {
        text = secrets."buildkite-agent-key.pub";
        user = "buildkite-agent-ci";
        permissions = "0600";
      };

      deployment.keys.gitlab-runner-registration = {
        text = secrets.gitlab-runner-registration;
        user = "gitlab-runner";
        permissions = "0600";
      };

      deployment.keys."marvin-mk2-key.pem" = {
        text = secrets."marvin-mk2-key.pem";
        destDir = "/var/lib/marvin-mk2";
        user = "marvin-mk2";
        group = "marvin-mk2";
        permissions = "0600";
      };

      deployment.keys."marvin_mk2_id.txt" = {
        text = secrets."marvin_mk2_id.txt";
        destDir = "/var/lib/marvin-mk2";
        user = "marvin-mk2";
        group = "marvin-mk2";
        permissions = "0600";
      };

      deployment.keys."marvin-mk2-webhook-secret.txt" = {
        text = secrets."marvin-mk2-webhook-secret.txt";
        destDir = "/var/lib/marvin-mk2";
        user = "marvin-mk2";
        group = "marvin-mk2";
        permissions = "0600";
      };

      deployment.keys."matterbridge.toml" = {
        text = secrets."matterbridge.toml";
        user = "matterbridge";
        group = "matterbridge";
        permissions = "0400";
      };

      deployment.keys."nix-community-cachix.dhall" = {
        text = secrets."nix-community-cachix.dhall";
        destDir = "/var/lib/post-build-hook";
        user = "root";
        permissions = "0400";
      };

      deployment.keys.github-nixpkgs-swh-key = {
        text = secrets.github-nixpkgs-swh-key;
        user = "buildkite-agent-ci";
        permissions = "0400";
      };

      deployment.keys.hydra-admin-password = {
        text = secrets.hydra-admin-password;
        user = "hydra";
        permissions = "0400";
      };

      deployment.keys.hydra-users = {
        text = secrets.hydra-users;
        user = "hydra";
        permissions = "0400";
      };
    };

  build02 =
    { resources, ... }:
    {
      imports = [
        ./build02/configuration.nix
      ];

      deployment.targetHost = "95.217.109.189";

      deployment.keys."id_rsa" = {
        text = secrets.github-r-ryantm-key;
        destDir = "/home/r-ryantm/.ssh";
        user = "r-ryantm";
        group = "r-ryantm";
        permissions = "0600";
      };

      deployment.keys."github_token.txt" = {
        text = secrets.github-r-ryantm-token;
        destDir = "/var/lib/nixpkgs-update";
        user = "r-ryantm";
        group = "r-ryantm";
        permissions = "0600";
      };

      deployment.keys."github_token_with_username.txt" = {
        text = "r-ryantm:${secrets.github-r-ryantm-token}";
        destDir = "/var/lib/nixpkgs-update";
        user = "r-ryantm";
        group = "r-ryantm";
        permissions = "0600";
      };

      deployment.keys."cachix.dhall" = {
        text = secrets."cachix.dhall";
        destDir = "/var/lib/nixpkgs-update/cachix";
        user = "r-ryantm";
        group = "r-ryantm";
        permissions = "0600";
      };

      deployment.keys."nix-community-cachix.dhall" = {
        text = secrets."nix-community-cachix.dhall";
        destDir = "/var/lib/post-build-hook";
        user = "root";
        permissions = "0400";
      };

    };

  build03 =
    { resources, ... }:
    {
      imports = [
        ./build03/configuration.nix
      ];

      deployment.targetHost = "build03.nix-community.org";
    };
}