/*
** Copyright 2017-present Open Networking Foundation
**
** 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.
*/

#include <stdio.h>
#include <bcmos_system.h>
#include <bal_api.h>

#undef _SYS_QUEUE_H_

#include "asfvolt16_driver.h"
#include "bal_access_terminal_hdlr.h"
#include "bal_subscriber_terminal_hdlr.h"
#include "bal_flow_hdlr.h"
#include "bal_group_hdlr.h"
#include "bal_interface_hdlr.h"
#include "bal_tmqueue_hdlr.h"
#include "bal_tmsched_hdlr.h"
#include "bal_packet_hdlr.h"
#include "bal_indications_hdlr.h"

bcmbal_access_term_id access_term_id = DEFAULT_ATERM_ID;

/********************************************************************\
 * Function : bal_register_indication_cbs                           *
 * Description : Registering the Call back function to handle the   *
 *               indciations from BAL                               *
 ********************************************************************/
uint32_t bal_register_indication_cbs()
{
    bcmos_errno err = BCM_ERR_OK;
    bcmbal_cb_cfg cb_cfg = {};
    uint16_t ind_subgroup;
    ASFVOLT_LOG(ASFVOLT_DEBUG, "Subscription for other messages\n");

    cb_cfg.module = BCMOS_MODULE_ID_NONE;

    /* Access Terminal Operational State Change */
    cb_cfg.obj_type = BCMBAL_OBJ_ID_ACCESS_TERMINAL;
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_acc_term_osc_indication_cb;
    ind_subgroup = bcmbal_access_terminal_auto_id_oper_status_change;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Register to get indications for interface objects
     */
    cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;

    /* Interface los */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_interface_los_indication_cb;
    ind_subgroup = bcmbal_interface_auto_id_los;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Interface Indication */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_interface_indication_cb;
    ind_subgroup = bcmbal_interface_auto_id_ind;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Interface Operational State Change */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_interface_osc_indication_cb;
    ind_subgroup = bcmbal_interface_auto_id_oper_status_change;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Register to get indications for subscriber terminal objects
     */
    cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;

    /* Subscriber Terminal Alarm */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_sub_term_alarm_indication_cb;
    ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_alarm;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Subscriber Terminal dgi */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_sub_term_dgi_indication_cb;
    ind_subgroup = bcmbal_subscriber_terminal_auto_id_dgi;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Subscriber Terminal Discovery */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_sub_term_disc_indication_cb;
    ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_disc;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Subscriber Terminal Indication */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_sub_term_indication_cb;
    ind_subgroup = bcmbal_subscriber_terminal_auto_id_ind;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Subscriber Terminal Operational State Change */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_sub_term_osc_indication_cb;
    ind_subgroup = bcmbal_subscriber_terminal_auto_id_oper_status_change;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Register to get indication callbacks for OMCI objects
     */
    cb_cfg.obj_type = BCMBAL_OBJ_ID_PACKET;

    ind_subgroup = BCMBAL_IND_SUBGROUP(packet, itu_omci_channel_rx);
    cb_cfg.p_object_key_info = NULL;
    cb_cfg.p_subgroup = &ind_subgroup;
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler )bal_omci_data_indication_cb;
    bcmbal_subscribe_ind(0, &cb_cfg);

    /* Bearer Channel Data */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_packet_data_indication_cb;
    ind_subgroup = bcmbal_packet_auto_id_bearer_channel_rx;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);
#if 0
    /* OAM Channel Data - oam response indication */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_oam_data_indication_cb;
    ind_subgroup = bcmbal_packet_auto_id_ieee_oam_channel_rx;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);
#endif
    /* Register to get indication callbacks for flow objects
     */
    cb_cfg.obj_type = BCMBAL_OBJ_ID_FLOW;

    /* Flow Operational State Change */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_flow_osc_indication_cb;
    ind_subgroup = bcmbal_flow_auto_id_oper_status_change;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Flow Indication */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_flow_indication_cb;
    ind_subgroup = bcmbal_flow_auto_id_ind;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Register to get indication callbacks for tm queue objects
     */
    cb_cfg.obj_type = BCMBAL_OBJ_ID_TM_QUEUE;
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_tm_queue_indication_cb;
    ind_subgroup = bcmbal_tm_queue_auto_id_ind;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Register to get indication callbacks for tm sched objects
     */
    cb_cfg.obj_type = BCMBAL_OBJ_ID_TM_SCHED;
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_tm_sched_indication_cb;
    ind_subgroup = bcmbal_tm_sched_auto_id_ind;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    /* Register to get indication callbacks for group objects
     */
    cb_cfg.obj_type = BCMBAL_OBJ_ID_GROUP;
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_group_indication_cb;
    ind_subgroup = bcmbal_group_auto_id_ind;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);
    return err;
}


/********************************************************************
 *                                                                  *
 *     gRPC service RPC function implementation                     *
 *                                                                  *
 ********************************************************************/

/********************************************************************\
 * Function    : asfvolt16_bal_init                                 *
 * Description : This function will initialize the BAL module       *
 ********************************************************************/
uint32_t asfvolt16_bal_init(BalInit *bal_init, balCoreIpInfo *coreInfo)

{
    bcmos_errno err = BCM_ERR_OK;

    char *ip_and_port = NULL;
    if (NULL == bal_init)
    {
       ASFVOLT_LOG(ASFVOLT_ERROR, "Recvied NULL balInit Structure from VOLTHA \n");
       return BAL_ERRNO__BAL_ERR_PERM;
    }
    else
    {
       ip_and_port = bal_init->voltha_adapter_ip_port;
       ASFVOLT_LOG(ASFVOLT_DEBUG,"\nRecevied Adapter IP and Port from VOLTHA is %s\n",ip_and_port);
    }
    char *argv[6];
    /* Initialize BAL */
    argv[1] = coreInfo->bal_core_arg1;
    argv[2] = coreInfo->bal_core_ip_port;
    argv[3] = coreInfo->bal_core_arg2;
    argv[4] = coreInfo->bal_shared_lib_ip_port;
    int argc = 5;
    client = grpc_c_client_init(ip_and_port, "bal_client", NULL);

    /* Init BAL */
    err = bcmbal_apiend_init_all(argc, argv, NULL,3);
    if(err != BCM_ERR_OK)
    {
      printf("\n Failed in bcmbal_init \n");
    }

#if 0
    err = (err != BCM_ERR_OK) ? err : bcmbal_autostart(); /* Execute bal_autostart.ini script if any */

    if (err)
    {
        /* Let logger task have enough time to drain its message queue. */
        usleep(1000000);
        ASFVOLT_LOG(ASFVOLT_ERROR, "failed to Initialize the BAL\n");
        return err;
    }
#endif

    /* Register the call back functions to handle any
     * indications from the BAL */
    bcmbal_cb_cfg cb_cfg = {};
    uint16_t ind_subgroup;

    cb_cfg.module = BCMOS_MODULE_ID_NONE;
    /* Register to get indications for access terminal objects
     */
    cb_cfg.obj_type = BCMBAL_OBJ_ID_ACCESS_TERMINAL;

    /* Access Terminal Indication */
    cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)bal_acc_term_indication_cb;
    ind_subgroup = bcmbal_access_terminal_auto_id_ind;
    cb_cfg.p_subgroup = &ind_subgroup;
    err = err ? err : bcmbal_subscribe_ind(access_term_id, &cb_cfg);

    if (err)
    {
      ASFVOLT_LOG(ASFVOLT_ERROR, "failed to register call back functions to BAL\n");
    }

    return err;
}

/********************************************************************\
 * Function    : asfvolt16_bal_finish                               *
 * Description : This function will Un-initialize the BAL module    *
 ********************************************************************/
uint32_t asfvolt16_bal_finish(void)
{
    bcmos_errno err = BCM_ERR_OK;

    /* Un-Initialize the BAL function */
    bcmbal_apiend_finish();

    return err;
}


/********************************************************************\
 * Function    : asfvolt16_bal_cfg_set                              *
 * Description : Handles below configuration                        *
 *               1) Access Terminal Cfg                             *
 *               2) Interface(PON & NNI) Cfg                        *
 *               3) Subscriber Terminal (ONU) cfg                   *
 *               4) Flow Cfg                                        *
 *               5) Group Cfg (In case of Multicast)                *
 ********************************************************************/
uint32_t asfvolt16_bal_cfg_set(BalCfg *cfg)
{
    bcmos_errno err = BCM_ERR_OK;
    memset(&voltha_device_id, 0, ASFVOLT_MAX_DEVICE_ID_SIZE);
    strcpy(voltha_device_id,cfg->device_id);

    switch(cfg->hdr->obj_type)
    {
       case BAL_OBJ_ID__BAL_OBJ_ID_ACCESS_TERMINAL:
       {
          err = bal_access_terminal_cfg_set(cfg->cfg);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_INTERFACE:
       {
          err = bal_interface_cfg_set(cfg->interface);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL:
       {
          err = bal_subscriber_terminal_cfg_set(cfg->terminal);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_FLOW:
       {
          err = bal_flow_cfg_set(cfg->flow);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_GROUP:
       {
          err = bal_group_cfg_set(cfg->group);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_TM_QUEUE:
       {
          err = bal_tm_queue_cfg_set(cfg->tm_queue_cfg);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_TM_SCHED:
       {
          err = bal_tm_sched_cfg_set(cfg->tm_sched_cfg);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_PACKET:
       {
          err = bal_packet_cfg_req(cfg->packet);
          break;
       }
       default:
       {
          ASFVOLT_LOG(ASFVOLT_ERROR, "Invalid objet type for configuration\n");
          err = BAL_ERRNO__BAL_ERR_INVALID_OP;
          break;
       }
    }
    return err;
}

/********************************************************************\
 * Function    : asfvolt16_bal_cfg_clear                            *
 * Description : Clears the configuration related to below objects  *
 *               1) Access Terminal Cfg                             *
 *               2) Interface(PON & NNI) Cfg                        *
 *               3) Subscriber Terminal (ONU) cfg                   *
 *               4) Flow Cfg                                        *
 *               5) Group Cfg (In case of Multicast)                *
 ********************************************************************/
uint32_t asfvolt16_bal_cfg_clear(BalKey *key)
{
    bcmos_errno err = BCM_ERR_OK;

    if(!key->hdr->has_obj_type)
    {
       ASFVOLT_LOG(ASFVOLT_ERROR, "object type is not present for clear\n");
       return BAL_ERRNO__BAL_ERR_INVALID_OP;
    }

    switch(key->hdr->obj_type)
    {
       case BAL_OBJ_ID__BAL_OBJ_ID_ACCESS_TERMINAL:
       {
          err = bal_access_terminal_cfg_clear(key->access_term_key);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_INTERFACE:
       {
          err = bal_interface_cfg_clear(key->interface_key);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL:
       {
          err = bal_subscriber_terminal_cfg_clear(key->terminal_key);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_FLOW:
       {
          err = bal_flow_cfg_clear(key->flow_key);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_GROUP:
       {
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_TM_QUEUE:
       {
          err = bal_tm_queue_cfg_clear(key->tm_queue_key);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_TM_SCHED:
       {
          err = bal_tm_sched_cfg_clear(key->tm_sched_key);
          break;
       }
       /*case BAL_KEY__OBJ_PACKET_KEY:
       {
          break;
       }*/
       default:
       {
          ASFVOLT_LOG(ASFVOLT_ERROR, "Invalid objet type to handle clear\n");
          err = BAL_ERRNO__BAL_ERR_INVALID_OP;
          break;
       }
    }
    return err;
}


/********************************************************************\
 * Function    : asfvolt16_bal_cfg_get                            *
 * Description : Get the configuration related to below objects  *
 *               1) Access Terminal Cfg                             *
 *               2) Interface(PON & NNI) Cfg                        *
 *               3) Subscriber Terminal (ONU) cfg                   *
 *               4) Flow Cfg                                        *
 *               5) Group Cfg (In case of Multicast)                *
 ********************************************************************/
uint32_t asfvolt16_bal_cfg_get(BalKey *key, BalCfg *cfg)
{
    bcmos_errno err = BCM_ERR_OK;

    if(!key->hdr->has_obj_type)
    {
       ASFVOLT_LOG(ASFVOLT_ERROR, "object type is not present for get\n");
       return BAL_ERRNO__BAL_ERR_INVALID_OP;
    }

    switch(key->hdr->obj_type)
    {
       case BAL_OBJ_ID__BAL_OBJ_ID_ACCESS_TERMINAL:
       {
          err = bal_access_terminal_cfg_get(key->access_term_key, cfg->cfg );
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_INTERFACE:
       {
          err = bal_interface_cfg_get(key->interface_key, cfg->interface);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL:
       {
          err = bal_subscriber_terminal_cfg_get(key->terminal_key, cfg->terminal);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_FLOW:
       {
          err = bal_flow_cfg_get(key->flow_key, cfg->flow);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_GROUP:
       {
          err = bal_group_cfg_get(key->group_key, cfg->group);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_TM_QUEUE:
       {
          err = bal_tm_queue_cfg_get(key->tm_queue_key, cfg->tm_queue_cfg);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_TM_SCHED:
       {
          err = bal_tm_sched_cfg_get(key->tm_sched_key, cfg->tm_sched_cfg);
          break;
       }
       case BAL_OBJ_ID__BAL_OBJ_ID_PACKET:
       {
          break;
       }
       default:
       {
          ASFVOLT_LOG(ASFVOLT_ERROR, "Invalid objet type to handle Get\n");
          err = BAL_ERRNO__BAL_ERR_INVALID_OP;
          break;
       }
    }
    return err;
}


