import { Injectable } from '@angular/core';
import { Plugin, Cordova, AwesomeCordovaNativePlugin } from '@awesome-cordova-plugins/core';

/**
 * @name WE Cap Inbox
 * @description
 * This plugin provides functionalities to manage notifications in your app.
 *
 * @usage
 * ```typescript
 * import { WECapInbox } from '@awesome-cordova-plugins/we-cap-inbox';
 *
 * constructor(private wECapInbox: WECapInbox) { }
 *
 * ...
 *
 * this.WECapInbox.getNotificationCount()
 *   .then((count: number) => console.log(count))
 *   .catch((error: string) => console.error(error));
 * ```
 */

@Plugin({
  pluginName: 'WECapInbox',
  plugin: 'we-notificationinbox-cordova', // npm package name, example: cordova-plugin-camera
  pluginRef: 'WENotificationInboxPlugin', // the variable reference to call the plugin,
  repo: 'https://github.com/WebEngage/we-ionic-notification-inbox',
  platforms: ['Android', 'iOS'], // Array of platforms supported, example: ['Android', 'iOS']
})
@Injectable()
export class WECapInbox extends AwesomeCordovaNativePlugin {
  /**
   * Resets the notification count.
   * @returns {Promise<void>}
   */
  @Cordova()
  resetNotificationCount(): Promise<void> {
    return;
  }

  /**
   * Retrieves the count of notifications.
   * @param {function} successCallback
   * @param {function} errorCallback
   * @returns {Promise<number>} - The count of notifications.
   */
  @Cordova()
  getNotificationCount(successCallback: (count: string) => void, errorCallback: (error: string) => void): Promise<any> {
    return;
  }

  /**-
   * Retrieves Notification List
   * @param {JsonObject | null} offset - Optional offset for notifications
   * @param {function} successCallback
   * @param {function} errorCallback
   * @returns {Promise<any>}
   */
  @Cordova()
  getNotificationList(
    offset: JsonObject | null,
    successCallback: (notifications: NotificationResponse) => void,
    errorCallback: (error: string) => void
  ): Promise<any> {
    return;
  }

  /**
   * Marks a specific notification as read.
   * @param {JsonObject} notificationObject - The notification to mark as read.
   * @returns {Promise<void>}
   */
  @Cordova()
  markRead(notificationObject: JsonObject): Promise<void> {
    return;
  }

  /**
   * Marks a specific notification as unread.
   * @param {JsonObject} notificationObject - The notification to mark as unread.
   * @returns {Promise<void>}
   */
  @Cordova()
  markUnread(notificationObject: JsonObject): Promise<void> {
    return;
  }

  /**
   * Tracks a click event on a notification.
   * @param {JsonObject} notificationObject - The notification that was clicked.
   * @returns {Promise<void>}
   */
  @Cordova()
  trackClick(notificationObject: JsonObject): Promise<void> {
    return;
  }

  /**
   * Tracks the view event of a notification.
   * @param {JsonObject} notificationObject - The notification that was viewed.
   * @returns {Promise<void>}
   */
  @Cordova()
  trackView(notificationObject: JsonObject): Promise<void> {
    return;
  }

  /**
   * Marks a specific notification as deleted.
   * @param {JsonObject} notificationObject - The notification to delete.
   * @returns {Promise<void>}
   */
  @Cordova()
  markDelete(notificationObject: JsonObject): Promise<void> {
    return;
  }

  /**
   * Marks all notifications as read.
   * @param {JsonArray} notificationList - An array of notification identifiers to mark as read.
   * @returns {Promise<void>}
   */
  @Cordova()
  readAll(notificationList: JsonArray): Promise<void> {
    return;
  }

  /**
   * Marks all notifications as unread.
   * @param {JsonArray} notificationList - An array of notification identifiers to mark as unread.
   * @returns {Promise<void>}
   */
  @Cordova()
  unReadAll(notificationList: JsonArray): Promise<void> {
    return;
  }

  /**
   * Deletes all notifications.
   * @param {JsonArray} notificationList - An array of notification identifiers to delete.
   * @returns {Promise<void>}
   */
  @Cordova()
  deleteAll(notificationList: JsonArray): Promise<void> {
    return;
  }
}

export type JsonValue = string | number | boolean | null | JsonObject | JsonArray;

export type NotificationResponse = {
  hasNext: boolean;
  messageList: JsonArray;
};

export type JsonObject = {
  [key: string]: JsonValue;
};

export type JsonArray = JsonValue[];
