{ config, pkgs, ... }:
with import <stockholm/lib>;
let
  dunstConfig = pkgs.writeText "dunst-config" ''
    [global]
    font = Iosevka Term 11

    # Allow a small subset of html markup:
    #   <b>bold</b>
    #   <i>italic</i>
    #   <s>strikethrough</s>
    #   <u>underline</u>
    #
    # For a complete reference see
    # <http://developer.gnome.org/pango/stable/PangoMarkupFormat.html>.
    # If markup is not allowed, those tags will be stripped out of the
    # message.
    markup = yes
    plain_text = no

    # The format of the message.  Possible variables are:
    #   %a  appname
    #   %s  summary
    #   %b  body
    #   %i  iconname (including its path)
    #   %I  iconname (without its path)
    #   %p  progress value if set ([  0%] to [100%]) or nothing
    # Markup is allowed
    format = "%a\n<b>%s</b>\n%b"

    # Sort messages by urgency.
    sort = yes

    # Show how many messages are currently hidden (because of geometry).
    indicate_hidden = yes

    # Alignment of message text.
    # Possible values are "left", "center" and "right".
    alignment = center

    # The frequency with wich text that is longer than the notification
    # window allows bounces back and forth.
    # This option conflicts with "word_wrap".
    # Set to 0 to disable.
    bounce_freq = 0

    # Show age of message if message is older than show_age_threshold
    # seconds.
    # Set to -1 to disable.
    show_age_threshold = 1

    # Split notifications into multiple lines if they don't fit into
    # geometry.
    word_wrap = yes

    # Ignore newlines '\n' in notifications.
    ignore_newline = no

    # Hide duplicate's count and stack them
    stack_duplicates = yes
    hide_duplicates_count = no


    # The geometry of the window:
    #   [{width}]x{height}[+/-{x}+/-{y}]
    # The geometry of the message window.
    # The height is measured in number of notifications everything else
    # in pixels.  If the width is omitted but the height is given
    # ("-geometry x2"), the message window expands over the whole screen
    # (dmenu-like).  If width is 0, the window expands to the longest
    # message displayed.  A positive x is measured from the left, a
    # negative from the right side of the screen.  Y is measured from
    # the top and down respectevly.
    # The width can be negative.  In this case the actual width is the
    # screen width minus the width defined in within the geometry option.
    geometry = "500x10-0+0"

    # Shrink window if it's smaller than the width.  Will be ignored if
    # width is 0.
    shrink = no

    # The transparency of the window.  Range: [0; 100].
    # This option will only work if a compositing windowmanager is
    # present (e.g. xcompmgr, compiz, etc.).
    # transparency = 5

    # Don't remove messages, if the user is idle (no mouse or keyboard input)
    # for longer than idle_threshold seconds.
    # Set to 0 to disable.
    idle_threshold = 0

    # Which monitor should the notifications be displayed on.
    monitor = keyboard

    # Display notification on focused monitor.  Possible modes are:
    #   mouse: follow mouse pointer
    #   keyboard: follow window with keyboard focus
    #   none: don't follow anything
    #
    # "keyboard" needs a windowmanager that exports the
    # _NET_ACTIVE_WINDOW property.
    # This should be the case for almost all modern windowmanagers.
    #
    # If this option is set to mouse or keyboard, the monitor option
    # will be ignored.
    follow = none

    # Should a notification popped up from history be sticky or timeout
    # as if it would normally do.
    sticky_history = yes

    # Maximum amount of notifications kept in history
    history_length = 15

    # Display indicators for URLs (U) and actions (A).
    show_indicators = no

    # The height of a single line.  If the height is smaller than the
    # font height, it will get raised to the font height.
    # This adds empty space above and under the text.
    line_height = 3

    # Draw a line of "separatpr_height" pixel height between two
    # notifications.
    # Set to 0 to disable.
    separator_height = 1

    # Padding between text and separator.
    padding = 1

    # Horizontal padding.
    horizontal_padding = 1

    # Define a color for the separator.
    # possible values are:
    #  * auto: dunst tries to find a color fitting to the background;
    #  * foreground: use the same color as the foreground;
    #  * frame: use the same color as the frame;
    #  * anything else will be interpreted as a X color.
    separator_color = frame

    # Print a notification on startup.
    # This is mainly for error detection, since dbus (re-)starts dunst
    # automatically after a crash.
    startup_notification = true

    # dmenu path.
    dmenu = ${pkgs.dmenu}/bin/dmenu -p dunst:

    # Browser for opening urls in context menu.
    browser = /usr/bin/firefox -new-tab

    # Align icons left/right/off
    icon_position = off
    max_icon_size = 80

    # Paths to default icons.
    icon_folders = /usr/share/icons/Paper/16x16/mimetypes/:/usr/share/icons/Paper/48x48/status/:/usr/share/icons/Paper/16x16/devices/:/usr/share/icons/Paper/48x48/notifications/:/usr/share/icons/Paper/48x48/emblems/

    frame_width = 2
    frame_color = "#8EC07C"

    [shortcuts]

    # Shortcuts are specified as [modifier+][modifier+]...key
    # Available modifiers are "ctrl", "mod1" (the alt-key), "mod2",
    # "mod3" and "mod4" (windows-key).
    # Xev might be helpful to find names for keys.

    # Close notification.
    close = ctrl+space

    # Close all notifications.
    close_all = ctrl+shift+space

    # Redisplay last message(s).
    # On the US keyboard layout "grave" is normally above TAB and left
    # of "1".
    history = ctrl+grave

    # Context menu.
    context = mod4+u

    [urgency_low]
    # IMPORTANT: colors have to be defined in quotation marks.
    # Otherwise the "#" and following would be interpreted as a comment.
    frame_color = "#3B7C87"
    foreground = "#3B7C87"
    background = "#191311"
    #background = "#2B313C"
    timeout = 1

    [urgency_normal]
    frame_color = "#5B8234"
    foreground = "#5B8234"
    background = "#191311"
    #background = "#2B313C"
    timeout = 1

    [urgency_critical]
    frame_color = "#B7472A"
    foreground = "#B7472A"
    background = "#191311"
    #background = "#2B313C"
    timeout = 1


    # Every section that isn't one of the above is interpreted as a rules to
    # override settings for certain messages.
    # Messages can be matched by "appname", "summary", "body", "icon", "category",
    # "msg_urgency" and you can override the "timeout", "urgency", "foreground",
    # "background", "new_icon" and "format".
    # Shell-like globbing will get expanded.
    #
    # SCRIPTING
    # You can specify a script that gets run when the rule matches by
    # setting the "script" option.
    # The script will be called as follows:
    #   script appname summary body icon urgency
    # where urgency can be "LOW", "NORMAL" or "CRITICAL".
    #
    # NOTE: if you don't want a notification to be displayed, set the format
    # to "".
    # NOTE: It might be helpful to run dunst -print in a terminal in order
    # to find fitting options for rules.

    #[espeak]
    #    summary = "*"
    #    script = dunst_espeak.sh

    #[script-test]
    #    summary = "*script*"
    #    script = dunst_test.sh

    #[ignore]
    #    # This notification will not be displayed
    #    summary = "foobar"
    #    format = ""

    #[signed_on]
    #    appname = Pidgin
    #    summary = "*signed on*"
    #    urgency = low
    #
    #[signed_off]
    #    appname = Pidgin
    #    summary = *signed off*
    #    urgency = low
    #
    #[says]
    #    appname = Pidgin
    #    summary = *says*
    #    urgency = critical
    #
    #[twitter]
    #    appname = Pidgin
    #    summary = *twitter.com*
    #    urgency = normal
    #
    # vim: ft=cfg
  '';
in {
  systemd.user.services.dunst = {
    wantedBy = [ "graphical-session.target" ];
    requires = [ "xmonad.service" ];
    environment = {
      DISPLAY = ":${toString config.services.xserver.display}";
    };
    serviceConfig = {
      SyslogIdentifier = "dunst";
      ExecStart = "${pkgs.dunst}/bin/dunst -conf ${dunstConfig}";
      Restart = "always";
      RestartSec = "15s";
      StartLimitBurst = 0;
    };
  };
}