/**
 *  \file cli_main.h
 *
 *  Header File for the CLI application to test the Mindtree
 *  Mesh stack.
 */

/*
 *  Copyright (C) 2017. Mindtree Ltd.
 *  All rights reserved.
 */

#ifndef _H_CLI_MAIN_
#define _H_CLI_MAIN_

/* --------------------------------------------- Header File Inclusion */
#include "cliface.h"
#include "MS_access_api.h"
#include "MS_config_api.h"
#include "MS_health_server_api.h"
#include "appl_main.h"
#include "blebrr.h"

/* --------------------------------------------- Global Definitions */

/* --------------------------------------------- Structures/Data Types */

//  ---------------- add by HZF, CLI options
#define CLI_NO_MAIN 
//#define CLI_PROVISION 
//#define CLI_PROXY 
//#define CLI_TRANSPORT 
//#define CLI_NETWORK 

//#define CLI_GENERICS_SERVER_MODEL 
//#define CLI_GENERICS_CLIENT_MODEL     

//#define CLI_GENERICS_ONOFF_SERVER_MODEL 
//#define CLI_GENERICS_ONOFF_CLIENT_MODEL

//#define CLI_CONFIG_SERVER_MODEL 
//#define CLI_CONFIG_CLIENT_MODEL 

//#define CLI_HEALTH_SERVER_MODEL 
//#define CLI_HEALTH_CLIENT_MODEL 

/*
 - CLI_GENERICS_ONOFF_CLIENT_MODEL
 - CLI_GENERICS_LEVEL_CLIENT_MODEL
 - CLI_GENERICS_TRANSITIONTIME_CLIENT_MODEL
 - CLI_GENERICS_PWRONOFF_CLIENT_MODEL
 - CLI_GENERICS_PWRLEVEL_CLIENT_MODEL
 - CLI_GENERICS_BATTERY_CLIENT_MODEL
 - CLI_GENERICS_LOCATION_CLIENT_MODEL
 - CLI_GENERICS_PROPERTY_CLIENT_MODEL

CLI_LIGHTINGS_CLIENT_MODEL                        -> Enables lightings client related CLI menu and submodel client menu with beow flags
 - CLI_LIGHTINGS_LIGHTNESS_CLIENT_MODEL
 - CLI_LIGHTINGS_CTL_CLIENT_MODEL
 - CLI_LIGHTINGS_HSL_CLIENT_MODEL
 - CLI_LIGHTINGS_XYL_CLIENT_MODEL
 - CLI_LIGHTINGS_LC_CLIENT_MODEL

 - CLI_GENERICS_LEVEL_SERVER_MODEL
 - CLI_GENERICS_TRANSITIONTIME_SERVER_MODEL
 - CLI_GENERICS_PWRONOFF_SERVER_MODEL
 - CLI_GENERICS_PWRLEVEL_SERVER_MODEL
 - CLI_GENERICS_BATTERY_SERVER_MODEL
 - CLI_GENERICS_LOCATION_SERVER_MODEL
 - CLI_GENERICS_PROPERTY_SERVER_MODEL

CLI_LIGHTINGS_SERVER_MODEL                        -> Enables setup of lightings server model and submodel with below flags
 - CLI_LIGHTINGS_LIGHTNESS_SERVER_MODEL
 - CLI_LIGHTINGS_CTL_SERVER_MODEL
 - CLI_LIGHTINGS_HSL_SERVER_MODEL
 - CLI_LIGHTINGS_XYL_SERVER_MODEL
 - CLI_LIGHTINGS_LC_SERVER_MODEL
 */

/* --------------------------------------------- Macros */

/* Debug Macros */
/* TBD: Mapped with debug sub-system */
#define CLI_APP_ERR(...)    printf(__VA_ARGS__)
#define CLI_APP_TRC(...)    printf(__VA_ARGS__)
#define CLI_APP_INF(...)    printf(__VA_ARGS__)

/* Console Input/Output */
#define CONSOLE_OUT(...)    printf(__VA_ARGS__)
#define CONSOLE_IN(...)     scanf(__VA_ARGS__)

/* Macro to declare a CLI Command Handler */
#define CLI_CMD_HANDLER_DECL(x) \
        API_RESULT (x) (UINT32 arc, UCHAR * arv[])

/* Macro to define an empty CLI Command Handler */
#define CLI_CMD_HANDLER_EMPTY_DEF(x) \
API_RESULT (x) (UINT32 argc, UCHAR * argv[]) \
{ \
    UINT32 index; \
 \
    CLI_APP_TRC(#x ". Argc %d\n", argc); \
 \
    for (index = 0; index < argc; index++) \
    { \
        CLI_APP_TRC("Argv[%d]: %s\n", index, argv[index]); \
    } \
 \
    return API_SUCCESS; \
}

/* --------------------------------------------- Internal Functions */
/* CLI Command Handler declaration for configuration client */
/* Level - Root */
CLI_CMD_HANDLER_DECL( cli_help );
CLI_CMD_HANDLER_DECL( cli_core );
CLI_CMD_HANDLER_DECL( cli_model );
CLI_CMD_HANDLER_DECL( cli_reset );
CLI_CMD_HANDLER_DECL( cli_ps );
CLI_CMD_HANDLER_DECL( cli_brr );
CLI_CMD_HANDLER_DECL( cli_set_log_level );

CLI_CMD_HANDLER_DECL(cli_back);
CLI_CMD_HANDLER_DECL(cli_root);

/* Level - Core */
CLI_CMD_HANDLER_DECL( cli_core_setup );
CLI_CMD_HANDLER_DECL( cli_core_provision );
CLI_CMD_HANDLER_DECL( cli_core_proxy );
CLI_CMD_HANDLER_DECL( cli_core_transport );
CLI_CMD_HANDLER_DECL( cli_core_network );
CLI_CMD_HANDLER_DECL( cli_core_enable_feature );
CLI_CMD_HANDLER_DECL( cli_core_disable_feature );

/* Level - Core - Network */
CLI_CMD_HANDLER_DECL(cli_core_network_send_packet);
CLI_CMD_HANDLER_DECL(cli_core_network_set_pkt_hdr);
CLI_CMD_HANDLER_DECL(cli_core_network_snb);
CLI_CMD_HANDLER_DECL(cli_core_network_get_ivindex);

/* Level - Core - Transport */
CLI_CMD_HANDLER_DECL(cli_core_transport_send_packet);
CLI_CMD_HANDLER_DECL(cli_core_transport_frndreq);
CLI_CMD_HANDLER_DECL(cli_core_transport_ctrlmsg);
CLI_CMD_HANDLER_DECL(cli_core_transport_clrreplaycache);

/* Level - Core - Provision */
CLI_CMD_HANDLER_DECL(cli_provision_uuid);
CLI_CMD_HANDLER_DECL(cli_core_provision_setup);
CLI_CMD_HANDLER_DECL(cli_core_provision_bind);
CLI_CMD_HANDLER_DECL(cli_core_provision_input_auth_val);
CLI_CMD_HANDLER_DECL(cli_core_provision_set_auth_action);
CLI_CMD_HANDLER_DECL(cli_core_provision_set_dev_pkey);
CLI_CMD_HANDLER_DECL(cli_core_provision_get_pkey);
CLI_CMD_HANDLER_DECL(cli_core_provision_get_dev_list);
CLI_CMD_HANDLER_DECL(cli_core_provision_delete_all_dev_keys);

/* Level - Core - Proxy */
CLI_CMD_HANDLER_DECL(cli_core_proxy_server_op);
CLI_CMD_HANDLER_DECL(cli_core_proxy_client_op);
CLI_CMD_HANDLER_DECL(cli_core_start_proxy_adv);
CLI_CMD_HANDLER_DECL(cli_core_stop_proxy_adv);
CLI_CMD_HANDLER_DECL(cli_core_set_wl_filter);
CLI_CMD_HANDLER_DECL(cli_core_set_bl_filter);
CLI_CMD_HANDLER_DECL(cli_core_add_addr_to_filter);
CLI_CMD_HANDLER_DECL(cli_core_rm_addr_to_filter);

/* Level - Model */
CLI_CMD_HANDLER_DECL(cli_model_server);
CLI_CMD_HANDLER_DECL(cli_model_client);

/* Level - Persistent Storage */
CLI_CMD_HANDLER_DECL(cli_ps_get_device_key);
CLI_CMD_HANDLER_DECL(cli_ps_get_app_key);
CLI_CMD_HANDLER_DECL(cli_ps_get_net_key);
CLI_CMD_HANDLER_DECL(cli_ps_get_primary_unicast_addr);

/* Level - Bearer Layer */
CLI_CMD_HANDLER_DECL(cli_create_gatt_conn);
CLI_CMD_HANDLER_DECL(cli_terminate_gatt_conn);
CLI_CMD_HANDLER_DECL(cli_discover_service);
CLI_CMD_HANDLER_DECL(cli_config_ntf);
CLI_CMD_HANDLER_DECL(cli_scan_feature);
CLI_CMD_HANDLER_DECL(cli_scan_rsp_data_set);

/* Model Server - Foundation Models */
CLI_CMD_HANDLER_DECL(cli_models_foundation);

/* Model Server - Health */
CLI_CMD_HANDLER_DECL(cli_models_health);

/* Model Server - Health - Log Fault */
CLI_CMD_HANDLER_DECL(cli_models_health_log_fault);

/* Health - TODO: Temporary till model publication period is triggered */
CLI_CMD_HANDLER_DECL(cli_health_status_publish);

/* Level - Model - Server */
/* Generics */
CLI_CMD_HANDLER_DECL(cli_models_generics);

/* Model Server - Generics - OnOff */
CLI_CMD_HANDLER_DECL(cli_models_generics_onoff);

/* Model Server - Generics - Level */
CLI_CMD_HANDLER_DECL(cli_models_generics_level);

/* Model Server - Generics - Default Transition Time */
CLI_CMD_HANDLER_DECL(cli_models_generics_default_transition_time);

/* Model Server - Generics - Power OnOff */
CLI_CMD_HANDLER_DECL(cli_models_generics_power_onoff);

/* Model Server - Generics - Power Level */
CLI_CMD_HANDLER_DECL(cli_models_generics_power_level);

/* Model Server - Generics - Battery */
CLI_CMD_HANDLER_DECL(cli_models_generics_battery);

/* Model Server - Generics - Location */
CLI_CMD_HANDLER_DECL(cli_models_generics_location);

/* Model Server - Generics - Property */
CLI_CMD_HANDLER_DECL(cli_models_generics_property);

/* Sensors */
CLI_CMD_HANDLER_DECL(cli_models_sensor);

/* Time and Scene */
/* Time */
CLI_CMD_HANDLER_DECL(cli_models_time);

/* Scene */
CLI_CMD_HANDLER_DECL(cli_models_scene);

/* Scheduler */
CLI_CMD_HANDLER_DECL(cli_models_scheduler);

/* Light */
CLI_CMD_HANDLER_DECL(cli_models_light);

/* Model Server - Light Lightness */
CLI_CMD_HANDLER_DECL(cli_models_light_lightness);

/* Model Server - Light CTL */
CLI_CMD_HANDLER_DECL(cli_models_light_ctl);

/* Model Server - Light HSL */
CLI_CMD_HANDLER_DECL(cli_models_light_hsl);

/* Model Server - Light xyL */
CLI_CMD_HANDLER_DECL(cli_models_light_xyl);

/* Model Server - Light LC */
CLI_CMD_HANDLER_DECL(cli_models_light_lc);

/* Model Server - Vendor */
CLI_CMD_HANDLER_DECL(cli_models_vendor);

/* Model Server - Set Default Transition Time in ms */
CLI_CMD_HANDLER_DECL(cli_models_light_lc_set_default_trans_timeout_in_ms);

/* Reset */
/* TODO: Shall be part of common reset called from root */
CLI_CMD_HANDLER_DECL(cli_models_reset);

/* Level - Model - Client */
CLI_CMD_HANDLER_DECL(cli_modelc_config);
CLI_CMD_HANDLER_DECL(cli_modelc_health);
CLI_CMD_HANDLER_DECL(cli_modelc_generic_onoff);
CLI_CMD_HANDLER_DECL(cli_modelc_generic_level);
CLI_CMD_HANDLER_DECL(cli_modelc_generic_default_transition_time);
CLI_CMD_HANDLER_DECL(cli_modelc_generic_power_onoff);
CLI_CMD_HANDLER_DECL(cli_modelc_generic_power_level);
CLI_CMD_HANDLER_DECL(cli_modelc_generic_battery);
CLI_CMD_HANDLER_DECL(cli_modelc_generic_location);
CLI_CMD_HANDLER_DECL(cli_modelc_generic_property);
CLI_CMD_HANDLER_DECL(cli_modelc_sensor);
CLI_CMD_HANDLER_DECL(cli_modelc_time);
CLI_CMD_HANDLER_DECL(cli_modelc_scene);
CLI_CMD_HANDLER_DECL(cli_modelc_scheduler);
CLI_CMD_HANDLER_DECL(cli_modelc_light_lightness);
CLI_CMD_HANDLER_DECL(cli_modelc_light_ctl);
CLI_CMD_HANDLER_DECL(cli_modelc_light_hsl);
CLI_CMD_HANDLER_DECL(cli_modelc_light_xyl);
CLI_CMD_HANDLER_DECL(cli_modelc_light_lc);

/* Common Utility Routines */
void cli_cmd_stack_push(/* IN */ CLI_COMMAND *cmd_list, /* IN */ UINT16 cmd_list_len);
void cli_cmd_stack_pop(void);

/* Module related Utility Routines */
void cli_gatt_bearer_iface_event_pl_cb
     (
         UCHAR  ev_name,
         UCHAR  ev_param
     );
#endif /* _H_CLI_MAIN_ */