/*

  Name:     https://masseffect.fandom.com/wiki/Vigil
  Why:      Counterpart to Vendetta
  Type:     VM
  Hardware: -
  From:     2023
  Role:     DNS Server
  Notes:

*/

{ pkgs, lib, nodes, ... }:
let
  name      = "vigil";
  ip_pub    = "193.1.99.109";
  ip_priv   = "172.20.20.4";
  hostname  = "${name}.skynet.ie";

  # sets which nameserver it is
  ns = "ns2";
in {
  imports = [

  ];

  deployment = {
    targetHost = ip_pub;
    targetPort = 22;
    targetUser = "root";

    tags = [ "active" "dns" ];
  };

  skynet_dns = {
    enable = true;

    # this server will have to have dns records
    own = {
      nameserver = ns;
      ip = ip_pub;
      external = [
        "${name}            A       ${ip_pub}"
        "${ns}              A       ${ip_pub}"
      ];
      cname = [
        #"misc             CNAME   vendetta"
      ];
      reverse = [
        "${builtins.substring 9 3 ip_pub} IN PTR ${hostname}."
      ];
    };

    records = {
      # using the same logic as the firewall, comments there
      external = builtins.concatLists (
        lib.attrsets.mapAttrsToList (key: value:
          if builtins.hasAttr "skynet_dns" value.config
          then (
            if value.config.skynet_dns.enable
            then value.config.skynet_dns.own.external
            else value.config.skynet_dns.records.external
          )
          else []
        ) nodes
      );

      cname = builtins.concatLists (
        lib.attrsets.mapAttrsToList (key: value:
          if builtins.hasAttr "skynet_dns" value.config
          then (
            if value.config.skynet_dns.enable
            then value.config.skynet_dns.own.cname
            else value.config.skynet_dns.records.cname
          )
          else []
        ) nodes
      );

      reverse = builtins.concatLists (
        lib.attrsets.mapAttrsToList (key: value:
          if builtins.hasAttr "skynet_dns" value.config
          then (
            if value.config.skynet_dns.enable
            then value.config.skynet_dns.own.reverse
            else value.config.skynet_dns.records.reverse
          )
          else []
        ) nodes
      );
    };
  };

}