/*
 * DWN - Desktop Window Manager
 * retoor <retoor@molodetz.nl>
 * D-Bus Notification daemon
 */

#ifndef DWN_NOTIFICATIONS_H
#define DWN_NOTIFICATIONS_H

#include "dwn.h"
#include <stdbool.h>
#include <dbus/dbus.h>

typedef enum {
    NOTIFY_URGENCY_LOW,
    NOTIFY_URGENCY_NORMAL,
    NOTIFY_URGENCY_CRITICAL
} NotifyUrgency;

typedef struct Notification {
    uint32_t id;
    char app_name[64];
    char summary[512];
    char *body;
    size_t body_len;
    char icon[256];
    int timeout;
    NotifyUrgency urgency;
    long expire_time;
    Window window;
    int width;
    int height;
    struct Notification *next;
} Notification;

extern DBusConnection *dbus_conn;

bool notifications_init(void);
void notifications_cleanup(void);

void notifications_process_messages(void);
bool notifications_register_service(void);

uint32_t notification_show(const char *app_name, const char *summary,
                           const char *body, const char *icon, int timeout);
void notification_close(uint32_t id);
void notification_close_all(void);
Notification *notification_find(uint32_t id);
Notification *notification_find_by_window(Window window);

void notification_render(Notification *notif);
void notifications_render_all(void);
void notifications_update(void);
void notifications_position(void);
void notifications_raise_all(void);

DBusHandlerResult notifications_handle_message(DBusConnection *conn,
                                                DBusMessage *msg,
                                                void *user_data);

void notifications_get_server_info(const char **name, const char **vendor,
                                   const char **version, const char **spec_version);
void notifications_get_capabilities(const char ***caps, int *count);

#endif
