{ config, lib, pkgs, ... }:

with lib;

let

  cfg = config.services.vdirsyncer;

  vdirsyncerOptions = [ ]
    ++ optional (cfg.verbosity != null) "--verbosity ${cfg.verbosity}"
    ++ optional (cfg.configFile != null) "--config ${cfg.configFile}";

in {
  meta.maintainers = [ maintainers.pjones ];

  options.services.vdirsyncer = {
    enable = mkEnableOption "vdirsyncer";

    package = mkOption {
      type = types.package;
      default = pkgs.vdirsyncer;
      defaultText = "pkgs.vdirsyncer";
      example = literalExpression "pkgs.vdirsyncer";
      description = "The package to use for the vdirsyncer binary.";
    };

    frequency = mkOption {
      type = types.str;
      default = "*:0/5";
      description = ''
        How often to run vdirsyncer.  This value is passed to the systemd
        timer configuration as the onCalendar option.  See
        {manpage}`systemd.time(7)`
        for more information about the format.
      '';
    };

    verbosity = mkOption {
      type = types.nullOr
        (types.enum [ "CRITICAL" "ERROR" "WARNING" "INFO" "DEBUG" ]);
      default = null;
      description = ''
        Whether vdirsyncer should produce verbose output.
      '';
    };

    configFile = mkOption {
      type = types.nullOr types.path;
      default = null;
      description = ''
        Optional configuration file to link to use instead of
        the default file ({file}`$XDG_CONFIG_HOME/vdirsyncer/config`).
      '';
    };
  };

  config = mkIf cfg.enable {
    systemd.user.services.vdirsyncer = {
      Unit = {
        Description = "vdirsyncer calendar&contacts synchronization";
        PartOf = [ "network-online.target" ];
      };

      Service = {
        Type = "oneshot";
        # TODO `vdirsyncer discover`
        ExecStart = let optStr = concatStringsSep " " vdirsyncerOptions;
        in [
          "${cfg.package}/bin/vdirsyncer ${optStr} metasync"
          "${cfg.package}/bin/vdirsyncer ${optStr} sync"
        ];
      };
    };

    systemd.user.timers.vdirsyncer = {
      Unit = { Description = "vdirsyncer calendar&contacts synchronization"; };

      Timer = {
        OnCalendar = cfg.frequency;
        Unit = "vdirsyncer.service";
      };

      Install = { WantedBy = [ "timers.target" ]; };
    };
  };
}
