{ lib, ... }:
let
  inherit (builtins) mapAttrs;
  inherit (lib.my) net;
  inherit (lib.my.c.colony) domain prefixes;
in
{
  nixos.systems.whale2 = {
    system = "x86_64-linux";
    nixpkgs = "mine";

    assignments = {
      routing = {
        name = "whale-vm-routing";
        inherit domain;
        ipv4.address = net.cidr.host 3 prefixes.vms.v4;
      };
      internal = {
        name = "whale-vm";
        altNames = [ "oci" ];
        inherit domain;
        ipv4 = {
          address = net.cidr.host 2 prefixes.vip1;
          mask = 32;
          gateway = null;
          genPTR = false;
        };
        ipv6 = {
          iid = "::3";
          address = net.cidr.host 3 prefixes.vms.v6;
        };
      };
      oci = {
        name = "whale-vm-oci";
        inherit domain;
        ipv4 = {
          address = net.cidr.host 1 prefixes.oci.v4;
          gateway = null;
        };
        ipv6.address = net.cidr.host 1 prefixes.oci.v6;
      };
    };

    extraAssignments = mapAttrs (n: i: {
      internal = {
        name = n;
        inherit domain;
        ipv4.address = net.cidr.host i prefixes.oci.v4;
        ipv6.address = net.cidr.host i prefixes.oci.v6;
      };
    }) {
      valheim-oci = 2;
      simpcraft-oci = 3;
      simpcraft-staging-oci = 4;
    };

    configuration = { lib, pkgs, modulesPath, config, assignments, allAssignments, ... }:
      let
        inherit (builtins) toJSON;
        inherit (lib) mkIf mkMerge mkForce;
        inherit (lib.my) networkdAssignment;
      in
      {
        imports = [
          "${modulesPath}/profiles/qemu-guest.nix"

          ./valheim.nix
          ./minecraft
        ];

        config = mkMerge [
          {
            boot = {
              kernelParams = [ "console=ttyS0,115200n8" ];
            };

            fileSystems = {
              "/boot" = {
                device = "/dev/disk/by-label/ESP";
                fsType = "vfat";
              };
              "/nix" = {
                device = "/dev/disk/by-label/nix";
                fsType = "ext4";
              };
              "/persist" = {
                device = "/dev/disk/by-label/persist";
                fsType = "ext4";
                neededForBoot = true;
              };

              "/var/lib/containers" = {
                device = "/dev/disk/by-label/oci";
                fsType = "xfs";
                options = [ "pquota" ];
              };
            };

            services = {
              fstrim = lib.my.c.colony.fstrimConfig;
              netdata.enable = true;
            };

            virtualisation = {
              podman = {
                enable = true;
              };
              oci-containers = {
                backend = "podman";
              };
              # NixOS has switched to using netavark, which is native to podman. It's currently missing an option to
              # disable iptables rules generation, which is very annoying.
              containers.containersConf.settings.network.network_backend = mkForce "cni";
            };

            environment = {
              etc = {
                "cni/net.d/90-colony.conflist".text = toJSON {
                  cniVersion = "0.4.0";
                  name = "colony";
                  plugins = [
                    {
                      type = "bridge";
                      bridge = "oci";
                      isGateway = true;
                      ipMasq = false;
                      hairpinMode = true;
                      ipam = {
                        type = "host-local";
                        routes = [
                          { dst = "0.0.0.0/0"; }
                          { dst = "::/0"; }
                        ];
                        ranges = [
                          [
                            {
                              subnet = prefixes.oci.v4;
                              gateway = net.cidr.host 1 prefixes.oci.v4;
                            }
                          ]
                          [
                            {
                              subnet = prefixes.oci.v6;
                              gateway = net.cidr.host 1 prefixes.oci.v6;
                            }
                          ]
                        ];
                      };
                      capabilities.ips = true;
                    }
                  ];
                };
              };
            };

            systemd.network = {
              links = {
                "10-vms" = {
                  matchConfig.MACAddress = "52:54:00:d5:d9:c6";
                  linkConfig.Name = "vms";
                };
              };

              networks = {
                "80-vms" = mkMerge [
                  (networkdAssignment "vms" assignments.routing)
                  (networkdAssignment "vms" assignments.internal)
                ];
              };
            };

            my = {
              secrets.key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDBTIj1jVdknXLNNroMJfgy7S2cSUC/qgFdnaUopEUzZ";
              server.enable = true;

              firewall = {
                tcp.allowed = [ 19999 ];
                trustedInterfaces = [ "oci" ];
                extraRules = ''
                  table inet filter {
                    chain forward {
                      # Trust that the outer firewall has done the filtering!
                      iifname vms oifname oci accept
                    }
                  }
                '';
              };
            };
          }
        ];
      };
  };
}