{
  config,
  lib,
  pkgs,
  namespace,
  ...
}:
with lib;
let
  inherit (lib.${namespace}) mkOpt;
  name = "protonmail-bridge";
  cfg = config.${namespace}.services.${name};

  protonmailConfig = lib.${namespace}.mkModule {
    inherit config name;
    description = "protonmail bridge";
    options = {
      imapPort = mkOpt types.int 1025 "imap port";
      smtpPort = mkOpt types.int 1143 "smtp port";
    };
    moduleConfig = {
      # Open firewall for protonmail bridge if enabled
      networking.firewall = mkIf cfg.openFirewall {
        allowedTCPPorts = [
          cfg.smtpPort
          cfg.imapPort
        ];
        allowedUDPPorts = [
          cfg.smtpPort
          cfg.imapPort
        ];
      };

      # Install protonmail-bridge package
      environment.systemPackages = with pkgs; [
        protonmail-bridge
        gnome-keyring
        gnupg
        pass
      ];

      # Configure systemd user service for protonmail-bridge
      systemd.user.services.protonmail-bridge = {
        description = "Protonmail Bridge";
        enable = true;
        environment = {
          GNUPGHOME = "%h/.gnupg";
          PASSWORD_STORE_DIR = "%h/.password-store";
        };
        script = "${lib.getExe pkgs.protonmail-bridge} --noninteractive";
        path = with pkgs; [
          gnome-keyring
          gnupg
          pass
          protonmail-bridge
        ];
        wantedBy = [ "default.target" ];
        after = [ "gpg-agent.service" ];
      };

      # Configure gpg-agent
      programs.gnupg.agent = {
        enable = true;
        enableSSHSupport = true;
      };
    };
  };
in
{
  imports = [ protonmailConfig ];
}
