{
  config,
  lib,
  ...
}:
with lib; let
  cfg = config.custom.containers.adguardhome;
in {
  options.custom.containers.adguardhome = {
    enable = mkOption {default = false;};
  };

  config = mkIf cfg.enable {
    #?? arion-adguardhome pull
    environment.shellAliases.arion-adguardhome = "sudo arion --prebuilt-file ${config.virtualisation.arion.projects.adguardhome.settings.out.dockerComposeYaml}";

    virtualisation.arion.projects.adguardhome.settings.services = {
      # https://github.com/AdguardTeam/AdGuardHome
      # https://adguard-dns.io/kb/adguard-home/overview/
      #?? ls /var/lib/caddy/.local/share/caddy/certificates/*
      adguardhome.service = {
        container_name = "adguardhome";
        image = "adguard/adguardhome:v0.107.56";

        ports = [
          "53:53/tcp" # DNS
          "53:53/udp" # DNS
          "853:853/tcp" # DNS-over-TLS
          "853:853/udp" # DNS-over-QUIC
          "3003:80/tcp" # Admin panel
          "8443:443/tcp" # DNS-over-HTTPS
        ];

        restart = "unless-stopped";

        volumes = [
          "${config.custom.containers.directory}/adguardhome/config:/opt/adguardhome/conf"
          "${config.custom.containers.directory}/adguardhome/data:/opt/adguardhome/data"
        ];
      };
    };

    # https://github.com/AdguardTeam/AdGuardHome/wiki/Encryption
    networking.firewall = {
      allowedTCPPorts = [
        53 # DNS
        853 # DNS-over-TLS
      ];

      allowedUDPPorts = [
        53 # DNS
        853 # DNS-over-QUIC
      ];
    };

    # https://adguard-dns.io/kb/adguard-home/faq/#bindinuse
    services.resolved.extraConfig = ''
      DNSStubListener=false
    '';
  };
}