/**
 * Copyright (2017) Baidu Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * File: lightduer_dcs_alert.h
 * Auth: Gang Chen (chengang12@baidu.com)
 * Desc: Light duer alert APIs.
 */

#ifndef BAIDU_DUER_LIGHTDUER_INCLUDE_LIGHTDUER_DCS_ALERT_H
#define BAIDU_DUER_LIGHTDUER_INCLUDE_LIGHTDUER_DCS_ALERT_H

#include <stdbool.h>
#include "baidu_json.h"
#include "lightduer_types.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    SET_ALERT_SUCCESS,
    SET_ALERT_FAIL,
    DELETE_ALERT_SUCCESS,
    DELETE_ALERT_FAIL,
    ALERT_START,
    ALERT_STOP,
} duer_dcs_alert_event_type;

typedef struct {
    char *type;    // "ALARM" or "TIMER"
    char *time;    // the time of the alert, ISO 8601 format.
    char *token;   // the alert token, it is the unique identification of an alert
} duer_dcs_alert_info_type;

/**
 * DESC:
 * Init alert.
 *
 * PARAM: none
 *
 * @RETURN: none.
 */
void duer_dcs_alert_init(void);

/**
 * DESC:
 * Report alert event
 *
 * PARAM:
 * @param[in] token: the token of the alert.
 * @param[in] type: event type, refer to duer_alert_event_type.
 *
 * @return: 0 when success, negative value when failed.
 */
int duer_dcs_report_alert_event(const char *token, duer_dcs_alert_event_type type);

#ifdef ENABLE_ALERT_TONE
/**
 * DESC:
 * Developer needs to implement this interface to set alert.
 *
 * PARAM:
 * @param[in] directive: the set alert directive.
 *
 * @RETURN: DUER_OK if success,
 *          DUER_MSG_RSP_BAD_REQUEST if the directive is invalid,
 *          DUER_ERR_FAILED if other error happened.
 */
duer_status_t duer_dcs_tone_alert_set_handler(const baidu_json *directive);
#else
/**
 * DESC:
 * Developer needs to implement this interface to set alert.
 *
 * PARAM:
 * @param[in] alert_info: the info about the alert, such as token, schedule time.
 *
 * @RETURN: none.
 */
void duer_dcs_alert_set_handler(const duer_dcs_alert_info_type *alert_info);
#endif

/**
 * DESC:
 * Developer needs to implement this interface to delete alert.
 *
 * PARAM:
 * @param[in] token: the token of the alert need to delete.
 *
 * @RETURN: none.
 */
void duer_dcs_alert_delete_handler(const char *token);

/**
 * DESC:
 * Add a alert info to the alert list, it should be used in duer_dcs_get_all_alert callback.
 * This API could be used in duer_dcs_get_all_alert, so DCS can get all alerts info.
 *
 * PARAM:
 * @param[out] alert_list: used to store the alert info.
 * @param[in] alert_info: the info about the alert, such as token, schedule time.
 * @param[in] is_active: whether this alert is sounding.
 *
 * @return: 0 when success, negative value when failed.
 */
int duer_insert_alert_list(baidu_json *alert_list,
                            duer_dcs_alert_info_type *alert_info,
                            bool is_active);

/**
 * DESC:
 * It's used to get all alert info by DCS.
 * Developer can implement this interface by call duer_dcs_report_alert to report all alert info.
 *
 * PARAM:
 * @param[out] alert_list: a json array used to store all alert info.
 *
 * @RETURN: none.
 */
void duer_dcs_get_all_alert(baidu_json *alert_list);

#ifdef __cplusplus
}
#endif

#endif/*BAIDU_DUER_LIGHTDUER_INCLUDE_LIGHTDUER_DCS_ALERT_H*/

