/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：
*	モジュール名	：FUIFE179
*	ソースファイル名：FUIFE179.java
*	作成者			：FJ
*	日付			：2022年01月26日
*＜機能概要＞
*	お客様請求契約一覧情報を取得する
*＜修正履歴＞
*	バージョン		修正日		修正者		修正内容
 *  v58.0.0   	2022/01/26  	FJ			ANK-4217-00-00_一般Webサービス申込機能再構築に伴うAPI作成
**********************************************************************/
package local.gyomu.api;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;

import com.k_opti.api_parts.server.bean.ApiServerPartsBean;
import com.k_opti.api_parts.server.exception.ApiServerExceptionGyomuErr;

import local.gyomu.ApiServerLocalBase;
import local.gyomu.api.common.ApiBpInterface;

@Path("FUIFE194")
public class FUIFE194 extends ApiServerLocalBase {

	/**
	 * APIID
	 */
	private static final String APIID = "FUIFE194";

	/**
	 * 呼び出す業務サービスID
	 */
	private static final String SERVICE_ID_1 = "FUSV0355";
	private static final String SERVICE_ID_2 = "FUSV0356";
	private static final String SERVICE_ID_3 = "FUSV0360";
	private static final String SERVICE_ID_4 = "FUSV0369";

	/**
	 * 相手先システムID
	 */
	private static final String SYSTEM_ID = "FTR1";

	/**
	 * JOBID
	 */
	private static final String JOB_ID = "FUIFE194";
	
	/**
	 * 公開メソッド
	 *
	 * @pram pRequest リクエスト
	 * @pram pContext コンテキスト
	 * @return Response レスポンス
	 * @throws Exception
	 */
	@POST
	public Response execute(@Context final HttpServletRequest pRequest, @Context final ServletContext pContext) throws Exception
	{

		/************************************************************
		 * ■■■基盤ロジック呼出■■■■■■■■■■■■■■■■■
		 ***********************************************************/
		// API共通部品呼出
		Response response = super.exec(APIID, pRequest, pContext);

		return response;
	}
	
	@Override
	protected ApiServerPartsBean run(ApiServerPartsBean reqPartsBean) throws Exception {
		// レスポンスデータ生成
		ApiServerPartsBean resPartsBean = this.logicExecute(reqPartsBean);

		/************************************************************
		 * ■■■基盤ロジック呼出■■■■■■■■■■■■■■■■■
		 ***********************************************************/
		return resPartsBean;
	}

	/**
	 * 業務ロジックメイン処理
	 * 指定されたサービスを呼び出し、結果をレスポンス情報に設定します。
	 *
	 * @param reqPartsBean サーバ業務AP連携データ(リクエスト)
	 * @return ApiServerPartsBean サーバ業務AP連携データ(レスポンス)
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ApiServerPartsBean logicExecute(ApiServerPartsBean reqPartsBean) throws Exception
	{

		Map<String, Object> body = reqPartsBean.getBody();
		String funcCode = (String)body.get("func_code");
		// サービス呼び出し
		String serviceId = null;
		if ("3".equals(funcCode))
		{
			serviceId = SERVICE_ID_2;
		} else {
			serviceId = SERVICE_ID_1;
		}
		Map<String, Object> outMap = new HashMap<String, Object>();
		try {
			outMap = callBpService(serviceId, reqPartsBean, JOB_ID, SYSTEM_ID);
		} catch(ApiServerExceptionGyomuErr ae){
			// 業務エラー
			List<Object> errList = new ArrayList<Object>();
			errList = reqPartsBean.getErrList();
			if (errList == null || errList.size() ==0)
			{
				Map<String, String> returnMap = new HashMap<String, String>();
				returnMap.put("errCode", "3001");
				returnMap.put("errMessage", "");
				errList.add(returnMap);
			}

			throw new ApiServerExceptionGyomuErr(reqPartsBean);
		} catch(Exception e){
			// システムエラー
			List<Object> errList = new ArrayList<Object>();
			Map<String, String> returnMap = new HashMap<String, String>();
			returnMap.put("errCode", "3001");
			returnMap.put("errMessage", "");
			errList.add(returnMap);
			reqPartsBean.setErrList(errList);

			throw new ApiServerExceptionGyomuErr(reqPartsBean);
		}

		// サービス処理の結果
		Map<String, Object> resultMap = (Map<String, Object>)outMap.get(serviceId + _01CC);

		// 業務データMapからエラー情報を取得する。
		Object errInfo = resultMap.get(ApiBpInterface.ERROR_INFO);

		if (errInfo != null && errInfo instanceof List<?>)
		{
			List<Object> errList = (List<Object>)errInfo;

			// reqPartsBeanにそのまま設定する
			reqPartsBean.setErrList(errList);

			// 業務データMapからエラー情報を削除する
			resultMap.remove(ApiBpInterface.ERROR_INFO);

			// レスポンス情報をセット
			reqPartsBean.setBody(resultMap);

			throw new ApiServerExceptionGyomuErr(reqPartsBean);
		}

		if ("3".equals(funcCode))
		{
			// 申込完了メール送信
			reqPartsBean.setBody(resultMap);
			serviceId = SERVICE_ID_3;
			callBpService(serviceId, reqPartsBean, JOB_ID, SYSTEM_ID);

			// WEB申込内容削除
			reqPartsBean.setBody(resultMap);
			serviceId = SERVICE_ID_4;
			callBpService(serviceId, reqPartsBean, JOB_ID, SYSTEM_ID);
		}
		
		// レスポンス情報をセット
		ApiServerPartsBean resPartsBean = new ApiServerPartsBean();
		resPartsBean.setBody(resultMap);

		return resPartsBean;
	}
}
