{
  config,
  pkgs,
  lib,
  ...
}:
let
  format = pkgs.formats.yaml { };
  cfg = config.satellite.dns;
in
{
  options.satellite.dns = {
    domain = lib.mkOption {
      description = "Default zone to include records in";
      type = lib.types.str;
    };

    records = lib.mkOption {
      description = "List of records to create";
      default = [ ];
      type = lib.types.listOf (
        lib.types.submodule (
          { config, ... }:
          {
            options = {
              at = lib.mkOption {
                description = "Subdomain to use for entry";
                type = lib.types.nullOr lib.types.str;
              };

              zone = lib.mkOption {
                description = "Zone this record is a part of";
                type = lib.types.str;
                default = cfg.domain;
              };

              type = lib.mkOption {
                type = lib.types.enum [
                  "A"
                  "AAAA"
                  "TXT"
                  "CNAME"
                  "MX"
                ];
                description = "The type of the DNS record";
              };

              to = lib.mkOption {
                type = lib.types.nullOr lib.types.str;
                description = "Shorthand for CNMAE-ing to a subdomain of the given zone";
                default = null;
              };

              value = lib.mkOption {
                type = format.type;
                description = "The value assigned to the record, in octodns format";
              };

              ttl = lib.mkOption {
                type = lib.types.int;
                description = "The TTL assigned to the record";
                default = 300;
              };

              enableCloudflareProxy = lib.mkEnableOption "proxying using cloudflare";
            };

            config.value = lib.mkIf (
              config.type == "CNAME" && config.to != null
            ) "${config.to}.${config.zone}.";
          }
        )
      );
    };
  };
}