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

with lib;
with types;
let
  cfg = config.services.taskwarrior-autotag;
  name = "taskwarrior-autotag";
in
{
  options.services.taskwarrior-autotag = {
    enable = mkEnableOption "taskwarrior autotag notification service";
    onCalendar = mkOption {
      type = str;
      default = "4:00:00";
    };
    recurrence = mkOption {
      type = enum [
        "on"
        "off"
      ];
      default = "off";
    };
    query = mkOption {
      type = str;
      default = "( +ACTIVE or +DUETODAY or +TODAY or +OVERDUE )";
    };
    dataDir = mkOption {
      type = str;
      default = "tasks";
    };
    tag_name = mkOption {
      type = str;
      default = "yolo";
      description = "tag do be set to the querried tasks.";
    };
    caFile = mkOption {
      type = path;
    };
    certificateFile = mkOption {
      type = path;
    };
    credentials = mkOption {
      type = str;
    };
    keyFile = mkOption {
      type = path;
    };
    server = mkOption {
      type = str;
    };
  };

  config = mkIf cfg.enable {

    users.users.${name} = {
      isSystemUser = true;
      home = "/var/lib/${name}";
      group = name;
    };
    users.groups.${name} = { };

    systemd.services.taskwarrior-autotag = {
      enable = true;
      serviceConfig = {
        User = name;
        StateDirectory = name;
      };
      script =
        let
          taskwarriorCommand = pkgs.writers.writeDash "taskwarrior-autotag" ''
            ${pkgs.taskwarrior}/bin/task \
               rc:/var/lib/${name}/.taskrc \
               rc.data.location=/var/lib/${name}/${cfg.dataDir} \
               rc.recurrence=${cfg.recurrence}  \
               rc.recurrence.confirmation=no \
               rc.taskd.ca=${cfg.caFile} \
               rc.taskd.certificate=${cfg.certificateFile} \
               rc.taskd.credentials="${cfg.credentials}" \
               rc.taskd.key=${cfg.keyFile} \
               rc.taskd.server=${cfg.server} \
               "$@"
          '';
          set_tag_query = "status:pending '${cfg.query}'";
          unset_tag_query = "'! ${cfg.query}'";
          yes = "${pkgs.coreutils}/bin/yes";
        in
        ''
          if [ -d /var/lib/${name}/${cfg.dataDir} ]
          then
            echo "synchronize ${cfg.dataDir}"
            ${taskwarriorCommand} sync
          else
            echo "initialize ${cfg.dataDir}"
            ${pkgs.coreutils}/bin/yes | ${taskwarriorCommand} sync init
          fi

          # todo continue
          ${yes} | ${taskwarriorCommand} ${unset_tag_query} mod -${cfg.tag_name}
          ${yes} | ${taskwarriorCommand} ${set_tag_query} mod +${cfg.tag_name}
          ${taskwarriorCommand} sync
        '';
    };
    systemd.timers.taskwarrior-autotag = {
      enable = true;
      timerConfig.OnCalendar = cfg.onCalendar;
      wantedBy = [ "multi-user.target" ];
    };
  };

}