/*
 * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
 * Copyright (c) 2017 Intel Corporation
 * Copyright (c) 2019, Infosys Ltd.
 *
 * 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 "json_data.h"
#include "s1ap_config.h"
#include "err_codes.h"

s1ap_config g_s1ap_cfg;

void
init_parser(char *path)
{
	load_json(path);
}

int
parse_s1ap_conf()
{
	char  mcc_dig1;
	char  mcc_dig2;
	char  mcc_dig3;
	char  mnc_dig1;
	char  mnc_dig2;
	char  mnc_dig3;

	/*s1ap information*/
	g_s1ap_cfg.mme_name = get_string_scalar("mme.name");
	if(NULL == g_s1ap_cfg.mme_name) return -1;

	g_s1ap_cfg.s1ap_local_ip = get_ip_scalar("s1ap.s1ap_local_addr");
	if(-1 == g_s1ap_cfg.s1ap_local_ip) return -1;
	g_s1ap_cfg.sctp_port = get_int_scalar("s1ap.sctp_port");
	if(-1 == g_s1ap_cfg.sctp_port) return -1;

	g_s1ap_cfg.enb_ip = get_ip_scalar("s1ap.enb_addr");
	if(-1 == g_s1ap_cfg.enb_ip) return -1;
	g_s1ap_cfg.enb_port = get_int_scalar("s1ap.enb_port");
	if(-1 == g_s1ap_cfg.enb_port) return -1;

	g_s1ap_cfg.mme_group_id = get_int_scalar("mme.group_id");
	if(-1 == g_s1ap_cfg.mme_group_id) return -1;

	g_s1ap_cfg.mme_code = get_int_scalar("mme.code");
	if(-1 == g_s1ap_cfg.mme_code) return -1;

	mcc_dig1 = get_int_scalar("mme.mcc.dig1");
	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
	mcc_dig2 = get_int_scalar("mme.mcc.dig2");
	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
	mcc_dig3 = get_int_scalar("mme.mcc.dig3");
	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
	mnc_dig1 = get_int_scalar("mme.mnc.dig1");
	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
	mnc_dig2 = get_int_scalar("mme.mnc.dig2");
	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
	mnc_dig3 = get_int_scalar("mme.mnc.dig3");
	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;

	g_s1ap_cfg.mme_plmn_id.idx[0] = mcc_dig2 << 4 | mcc_dig1;
	g_s1ap_cfg.mme_plmn_id.idx[1] = mnc_dig3 << 4 | mcc_dig3;
	g_s1ap_cfg.mme_plmn_id.idx[2] = mnc_dig2 << 4 | mnc_dig1;

	return SUCCESS;
}
