{ config, lib, pkgs, ... }:

with lib;
{
  config = let
    local-host = config.instance.hostname;
    local-domain = config.fudo.hosts.${local-host}.domain;
    local-site = config.fudo.hosts.${local-host}.site;
    local-zone = config.fudo.domains.${local-domain}.zone;

    host = config.fudo.hosts.${local-host};

    host-user-list = host.local-users;
    domain-user-list = config.fudo.domains."${local-domain}".local-users;
    site-user-list = config.fudo.sites."${local-site}".local-users;
    all-users =
      getAttrs (host-user-list ++ domain-user-list ++ site-user-list) config.fudo.users;

    host-admin-list = host.local-admins;
    domain-admin-list = config.fudo.domains."${local-domain}".local-admins;
    site-admin-list = config.fudo.sites."${local-site}".local-admins;
    local-admins = host-admin-list ++ domain-admin-list ++ site-admin-list;

    host-group-list = host.local-groups;
    domain-group-list = config.fudo.domains."${local-domain}".local-groups;
    site-group-list = config.fudo.sites."${local-site}".local-groups;
    local-groups =
      getAttrs (host-group-list ++ domain-group-list ++ site-group-list)
        config.fudo.groups;

    local-hosts =
      filterAttrs (host: hostOpts: hostOpts.site == local-site) config.fudo.hosts;

    local-networks =
      host.local-networks ++
      config.fudo.domains.${local-domain}.local-networks ++
      config.fudo.sites.${local-site}.local-networks;

    local-profile = host.profile;

    host-fqdn = "${config.instance.hostname}.${local-domain}";

    local-users =
      if (host.hardened) then
        getAttrs local-admins all-users
      else all-users;

  in {
    instance = {
      inherit
        host-fqdn
        local-domain
        local-site
        local-users
        local-admins
        local-groups
        local-hosts
        local-profile
        local-networks
        local-zone;
    };
  };
}