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

with lib;

let

  cfg = config.programs.todoman;

  format = pkgs.formats.keyValue { };

in {

  meta.maintainers = [ hm.maintainers.mikilio ];

  options.programs.todoman = {
    enable = lib.mkEnableOption "todoman";

    glob = mkOption {
      type = types.str;
      default = "*";
      description = ''
        The glob expansion which matches all directories relevant.
      '';
      example = "*/*";
    };

    extraConfig = mkOption {
      type = types.lines;
      default = "";
      description = ''
        Text for configuration of todoman.
        The syntax is Python.

        See [docs](`https://todoman.readthedocs.io/en/stable/man.html#id5`).
        for the full list of options.
      '';
      example = ''
        date_format = "%Y-%m-%d";
        time_format = "%H:%M";
        default_list = "Personal";
        default_due = 48;
      '';
    };
  };

  config = mkIf cfg.enable {
    assertions = [{
      assertion = config.accounts.calendar ? basePath;
      message = ''
        A base directory for calendars must be specified via
        `accounts.calendar.basePath` to generate config for todoman
      '';
    }];

    home.packages = [ pkgs.todoman ];

    xdg.configFile."todoman/config.py".text = lib.concatLines [
      ''path = "${config.accounts.calendar.basePath}/${cfg.glob}"''
      cfg.extraConfig
    ];
  };
}