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

let
  cfg = config.services.signaturepdf;
  extraConfigToArgs = extraConfig:
    lib.flatten
    (lib.mapAttrsToList (name: value: [ "-d" "${name}=${value}" ]) extraConfig);
in {
  meta.maintainers = [ lib.maintainers.DamienCassou ];

  options.services.signaturepdf = with lib; {
    enable = mkEnableOption
      "signaturepdf; signing, organizing, editing metadatas or compressing PDFs";

    package = mkOption {
      type = types.package;
      default = pkgs.signaturepdf;
      defaultText = "pkgs.signaturepdf";
      description = "signaturepdf derivation to use.";
    };

    port = mkOption {
      type = types.port;
      default = 8080;
      example = 8081;
      description = "The port on which the application runs";
    };

    extraConfig = mkOption {
      default = { };
      type = with types;
        let primitive = oneOf [ str int bool float ];
        in attrsOf primitive;
      example = {
        upload_max_filesize = "24M";
        post_max_size = "24M";
        max_file_uploads = "201";
      };
      description = "Additional configuration optional.";
    };
  };

  config = lib.mkIf cfg.enable {
    xdg.desktopEntries = {
      signaturepdf = {
        name = "SignaturePDF";
        exec = "${pkgs.xdg-utils}/bin/xdg-open http://localhost:${
            toString cfg.port
          }";
        terminal = false;
        icon = "${cfg.package}/share/signaturepdf/public/favicon.ico";
      };
    };

    systemd.user.services.signaturepdf = {
      Unit = {
        Description =
          "signaturepdf; signing, organizing, editing metadatas or compressing PDFs";
      };

      Service = {
        ExecStart = "${cfg.package}/bin/signaturepdf ${toString cfg.port} ${
            lib.escapeShellArgs (extraConfigToArgs cfg.extraConfig)
          }";
      };

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