{
  config,
  lib,
  namespace,
  ...
}:
with lib;
let
  name = "authentik";
  cfg = config.${namespace}.services.${name};
  cfgRac = config.${namespace}.services."authentikRac";

  authentikConfig = lib.${namespace}.mkModule {
    inherit config name;
    description = "authentik Service";
    options = { };
    moduleConfig = {
      services = {
        authentik = {
          enable = true;
          environmentFile = cfg.environmentFile;
          settings = {
            port = cfg.port;
          };
        };
      };
    };
  };

  authentikRacConfig = lib.${namespace}.mkModule {
    inherit config;
    name = "authentikRac";
    serviceName = "podman-authenticRac";
    description = "authentik_rac Service";
    options = { };
    moduleConfig = {
      virtualisation.oci-containers.containers."authenticRac" = {
        autoStart = true;
        image = "ghcr.io/goauthentik/rac";
        ports = [ "${toString cfgRac.port}:4822" ];
        volumes = [
          "${cfg.configDir}/authentik-rac:/media"
        ];
        environment = {
          AUTHENTIK_HOST = "https://${name}.mjallen.dev";
          AUTHENTIK_TOKEN = "0XGkB2pXoOTqcCMAjucAtfamvlsIZCPmy1Zri54Ozjj3zzMCvcLwkQPrukfx";
          AUTHENTIK_INSECURE = "false"; # Set to true for self-signed certs
          PUID = toString cfg.puid;
          PGID = toString cfg.pgid;
          TZ = cfg.timeZone;
        };
      };
    };
  };
in
{
  imports = [
    authentikConfig
    authentikRacConfig
  ];
}
