
enum LocalNotificationType {
    LOCAL_NOTIFICATION_TYPE_DEFAULT,
    LOCAL_NOTIFICATION_TYPE_PHONE_CALL,
    LOCAL_NOTIFICATION_TYPE_HOLD_PHONE_CALL,
    LOCAL_NOTIFICATION_TYPE_END_PHONE_CALL,
    LOCAL_NOTIFICATION_TYPE_CHAT_MESSAGE,
    LOCAL_NOTIFICATION_TYPE_DECISION,
    LOCAL_NOTIFICATION_TYPE_REPLY,
    LOCAL_NOTIFICATION_TYPE_APP_NOTIFY,
    LOCAL_NOTIFICATION_TYPE_DOWNLOAD_PROGRESS
};

enum LocalNotificationAction {
    LOCAL_NOTIFICATION_ACTION_DEFAULT,
    LOCAL_NOTIFICATION_ACTION_ACCEPT,
    LOCAL_NOTIFICATION_ACTION_REJECT,
    LOCAL_NOTIFICATION_ACTION_REPLY
};

typedef struct {
    int id;
    const char* name;
} NotificationIdNameItem;

class UNotifications {
public:
    virtual void LocalNotificationClicked(const char* ref, enum LocalNotificationAction action, const char* replyText = nullptr) = 0;
};

class INotifications {
public:
    virtual void AddLocalNotification(const char* ref, LocalNotificationType type, const char* title, const char* text, const char* smallIcon, const char* largeIcon,
        const char* soundUrl, const char* buttonTitle, const char* acceptTitle, const char* rejectTitle, const char* replyTitle, const char * link, UNotifications * user) = 0;
    virtual void RemoveLocalNotification(const char* ref) = 0;
    virtual void ShowUpdateNotification(const char * title, const char * text, bool showAtOnce) = 0;
    virtual void SetShowDesktopNotifications(bool showDesktopNotifications) = 0;
    virtual void SessionLocked(bool locked) {};
    virtual void UpdateDownloadProgressNotification(const char* ref, int totalBytes, int receivedBytes) {};
};
