{
  lib,
  self,
  config,
  ...
}:
let
  inherit (lib) mkEnableOption mkIf types;
  inherit (self) namespace;
  inherit (self.lib) mkOpt;

  cfg = config.${namespace}.services.homepage;
in
{
  options.${namespace}.services.homepage = {
    enable = mkEnableOption "Homepage, an intuitive dashboard for your services.";
    subdomain =
      mkOpt types.str "home"
        "The subdomain, of the system domain, the service should be exposed on.";
    configDir =
      mkOpt types.path null
        "The config directory, which will be copied to the Homepage directory during compilation.";
  };

  config = mkIf cfg.enable {
    systemd.tmpfiles.rules = [
      "d /var/lib/containers/homepage 0700 root root -"
      "d /var/lib/containers/homepage/config 0700 root root -"
      "d /var/lib/containers/homepage/images 0700 root root -"
    ];

    # Copy files from homepageConfigDirectory to the target directory
    system.activationScripts.homepage = ''
      cp -r ${cfg.configDir}/* /var/lib/containers/homepage/
    '';

    virtualisation.oci-containers.containers.homepage = {
      image = "ghcr.io/gethomepage/homepage:latest";
      autoStart = true;
      hostname = config.networking.hostName;
      labels = {
        "traefik.enable" = "true";
        "traefik.http.routers.homepage.entrypoints" = "websecure";
        "traefik.http.routers.homepage.rule" = "Host(`${cfg.subdomain}.${
          config.${namespace}.services.domain
        }`)";
        "traefik.http.services.homepage.loadbalancer.server.port" = "3000";
      };
      volumes = [
        "/var/lib/containers/homepage/config:/app/config:rw"
        "/var/lib/containers/homepage/images:/app/public/images:rw"

        # Optional, used for docker integration.
        "/var/run/docker.sock:/var/run/docker.sock:ro"
      ];
      environment = {
        "HOMEPAGE_ALLOWED_HOSTS" = "${cfg.subdomain}.${config.${namespace}.services.domain}";
      };
      extraOptions = [ "--network=proxy" ];
    };
  };
}
