{ config, pkgs, ... }:
{
  home.packages = [
    (pkgs.writeShellScriptBin "davmail-setup" ''
      systemctl --user restart davmail # Ensure config file is present
      systemctl --user stop davmail
      ${pkgs.davmail}/bin/davmail -n ~/.davmail.properties
      systemctl --user restart davmail
    '')
  ];
  accounts.email = {
    maildirBasePath = "Mail";
    accounts =
      let
        realName = "Evie Litherland-Smith";
      in
      {
        proton =
          let
            address = "e.litherlandsmith@proton.me";
            host = "127.0.0.1";
            tls.enable = false;
          in
          {
            inherit realName address;
            primary = true;
            maildir.path = "Proton";
            imap = {
              inherit host tls;
              port = 1143;
            };
            smtp = {
              inherit host tls;
              port = 1025;
            };
            aliases = [
              "evie@xenia.me.uk"
              "evie@litherlandsmith.slmail.me"
            ];
            userName = address;
            passwordCommand = "${pkgs.libsecret}/bin/secret-tool lookup email ${address}";
            mu.enable = true;
            msmtp = {
              enable = true;
              extraConfig = {
                tls = "off";
                auth = "login";
              };
            };
            mbsync = {
              enable = true;
              create = "both";
              expunge = "both";
              remove = "both";
              patterns = [
                "*"
                "!All Mail"
                "!Labels*"
                "!Starred"
                "!Recovered Messages"
              ];
              subFolders = "Verbatim";
              extraConfig.account.AuthMechs = "LOGIN";
            };
          };
        icloud =
          let
            address = "e.litherlandsmith@icloud.com";
          in
          {
            inherit realName address;
            primary = false;
            maildir.path = "iCloud";
            imap.host = "imap.mail.me.com";
            smtp.host = "smtp.mail.me.com";
            userName = address;
            passwordCommand = "${pkgs.libsecret}/bin/secret-tool lookup email ${address}";
            mu.enable = true;
            msmtp.enable = true;
            mbsync = {
              enable = true;
              create = "both";
              expunge = "both";
              remove = "both";
              patterns = [
                "*"
                "!Notes"
              ];
              subFolders = "Verbatim";
            };
          };
        outlook =
          let
            address = "evie.litherland-smith@ukaea.uk";
            host = "127.0.0.1";
            tls.enable = false;
          in
          {
            inherit realName address;
            primary = false;
            maildir.path = "Outlook";
            imap = {
              inherit host tls;
              port = 1144;
            };
            smtp = {
              inherit host tls;
              port = 1026;
            };
            aliases = [ "elitherl@jet.uk" ];
            userName = address;
            passwordCommand = "${pkgs.libsecret}/bin/secret-tool lookup email ${address}";
            mu.enable = true;
            msmtp = {
              enable = true;
              extraConfig = {
                tls = "off";
                auth = "login";
              };
            };
            mbsync = {
              enable = true;
              create = "both";
              expunge = "both";
              remove = "both";
              patterns = [
                "*"
                "!Conversation History"
                "!Snoozed"
                "!Social Activity Notifications"
                "!Sync Issues*"
                "!Unsent Messages"
              ];
              subFolders = "Verbatim";
              extraConfig.account.AuthMechs = "LOGIN";
            };
          };
      };
  };
  programs = {
    mu.enable = true;
    msmtp.enable = true;
    mbsync = {
      enable = true;
      groups.inboxes = {
        proton = [ "INBOX" ];
        icloud = [ "INBOX" ];
        outlook = [ "INBOX" ];
      };
    };
  };
  services.mbsync = {
    inherit (config.programs.mbsync) enable package;
    frequency = "*:0/30"; # Every 30 minutes
    verbose = true;
    preExec = null;
    postExec = null;
  };
  systemd.user.services.davmail = {
    Unit = {
      Description = "Davmail server";
      Wants = [ "network-online.target" ];
      After = [ "network-online.target" ];
    };
    Service = {
      Environment = [ "PATH=/run/current-system/sw/bin/:$PATH" ];
      Restart = "always";
      ExecStartPre = with config.home; ''
        /bin/sh -c "if [ ! -f ${homeDirectory}/.davmail.properties ]; then cp ${./davmail.properties} ${homeDirectory}/.davmail.properties; fi; chmod 644 ${homeDirectory}/.davmail.properties"
      '';
      ExecStart = "${pkgs.davmail}/bin/davmail -notray ${config.home.homeDirectory}/.davmail.properties";
    };
    Install.WantedBy = [ "default.target" ];
  };
}