{ lib, dnsLib, ... }:

with lib;

rec {

  hasSuffix' = flip strings.hasSuffix;

  domainToZone = allowedDomains: domain: (findFirst (hasSuffix' domain) null allowedDomains);

  filterElligibleDomains = allowedDomains: domain: domainToZone allowedDomains domain != null;

  domainsFromConfiguration =
    allowedDomains: config:
    filter (filterElligibleDomains allowedDomains) (attrNames config.services.nginx.virtualHosts);

  ipsToRecord =
    ipType: ipValue:
    with dnsLib.combinators;
    if ipType == "ipv4" then { A = [ ipValue ]; } else { AAAA = [ ipValue ]; };

  domainToRecords =
    domain: machineMeta: isVPNDomain:
    with dnsLib.combinators;
    (optionalAttrs isVPNDomain (
      mapAttrsWithMerge (n: v: nameValuePair domain (ipsToRecord n v)) machineMeta.ips.vpn
    ))
    // (optionalAttrs (!isVPNDomain) (
      mapAttrsWithMerge (n: v: nameValuePair domain (ipsToRecord n v)) machineMeta.ips.public
    ));

  getDomainPrefix =
    allowedDomains: domain:
    let
      zone = domainToZone allowedDomains domain;
    in
    strings.removeSuffix ".${zone}" domain;

}