{ config, lib, ... }:
let
  inherit (lib) mkEnableOption mkOption mkIf;
  inherit (config.my-lib.settings)
    internalDomain
    ;
  cfg = config.commonSettings.network;
in
{
  options.commonSettings.network = {
    localdns = {
      enable = mkEnableOption "Local DNS resolver";
      cacheSize = mkOption {
        type = lib.types.int;
        description = "Max cache size for knot-resolver in MB";
        default = 100;
      };
    };
  };

  config = {
    networking.resolvconf = mkIf cfg.localdns.enable {
      enable = true;
      dnsExtensionMechanism = false;
      useLocalResolver = true;
    };

    services.kresd = mkIf cfg.localdns.enable {
      enable = true;
      listenPlain = [ "127.0.0.1:53" ];
      listenTLS = [ "127.0.0.1:853" ];
      extraConfig =
        let
          listToLuaTable =
            x:
            lib.pipe x [
              (builtins.split "\n")
              (builtins.filter (s: s != [ ] && s != ""))
              (lib.strings.concatMapStrings (x: "'${x}',"))
            ];
          chinaDomains = listToLuaTable (builtins.readFile ./china-domains.txt);
          globalSettings = ''
            log_level("notice")
            modules = { 'hints > iterate', 'stats', 'predict' }
            cache.size = ${toString cfg.localdns.cacheSize} * MB
            trust_anchors.remove(".")
          '';
          tsSettings = ''
            internalDomains = policy.todnames({'${internalDomain}'})
            policy.add(policy.suffix(policy.STUB({'100.100.100.100'}), internalDomains))
          '';
          proxySettings = ''
            policy.add(policy.domains(
              policy.ANSWER({ [kres.type.A] = { rdata=kres.str2ip('8.218.218.229'), ttl=300 } }),
              { todname('hk-00.namely.icu') }))
            policy.add(policy.domains(
              policy.ANSWER({ [kres.type.A] = { rdata=kres.str2ip('67.230.168.47'), ttl=300 } }),
              { todname('la-00.namely.icu') }))
            policy.add(policy.domains(
              policy.ANSWER({ [kres.type.A] = { rdata=kres.str2ip('185.217.108.59'), ttl=300 } }),
              { todname('fra-00.namely.icu') }))
          '';
          mainlandSettings = ''
            chinaDomains = policy.todnames({'namely.icu', ${chinaDomains}})
            policy.add(policy.suffix(policy.TLS_FORWARD({
              { "223.5.5.5", hostname="dns.alidns.com" },
              { "223.6.6.6", hostname="dns.alidns.com" },
            }), chinaDomains))
            policy.add(policy.all(policy.TLS_FORWARD({
              { "8.8.8.8", hostname="dns.google" },
              { "8.8.4.4", hostname="dns.google" },
            })))
          '';
          overseaSettings = ''
            policy.add(policy.all(policy.TLS_FORWARD({
              { "8.8.8.8", hostname="dns.google" },
              { "8.8.4.4", hostname="dns.google" },
            })))
          '';
        in
        globalSettings
        + (if config.services.dae.enable then proxySettings else "")
        + (if config.services.tailscale.enable then tsSettings else "")
        + (if config.inMainland then mainlandSettings else overseaSettings);
    };
  };
}
