/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：CNA00501SFLogic
*   ソースファイル名：CNA00501SFLogic.java
*   作成者          ：富士通
*   日付            ：2013年02月08日
*＜機能概要＞
*   ０５０番号仮発行を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/01/31   FJ          新規作成
*
**********************************************************************/

package eo.web.webview.CNA00501SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.common.util.JCKLcsCommonUtil.isNullOrEmpty;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.constant.JCNStrConst;
import eo.web.webview.CNA00401SF.CNA00401SFConst;
import eo.web.webview.common.JCNWebCommon;

/**
 * ０５０番号仮発行処理
 * @author FJ
 *
 */
@SuppressWarnings("serial")
public class CNA00501SFLogic extends X31BWebBusinessLogic
{

	
	/**
	 * 空文字
	 */
	private static final String STR_BLANK = "";
	
	/**
	 * APIリターンコード(システムエラー)
	 */
	private static final String S_API_RTN_CD_SYS_ERR = JCNStrConst.S_API_RTN_CD_SYS_ERR;
	
	/**
	 * APIリターンコード(正常)
	 */
	private static final String S_API_RTN_CD_OK = JCNStrConst.S_API_RTN_CD_OK;
	
	/**
	 * クレジットオーソリサービスID
	 */
	private static final String SERVICE_ID = "CNSV0044";
	
	/**
	 * サービスコンポーネント名
	 */
	private static final String CC_NAME = "JCN050KariHakkoCC";	
	
	/**
	 * APIリクエスト時
	 * 
	 * @return boolean 処理結果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean action_Init() throws Exception
	{

		DEBUG_LOG.info("action_Init Start!");

		X31SDataBeanAccess bean = getServiceFormBean();

		try
		{
			// リクエストパラメータを取得・格納
			Map<String, String> reqestMap = super.getRequestParams();
			
			DEBUG_LOG.info("テスト reqestMap= " + reqestMap.toString());
			DEBUG_LOG.info("テスト(UTF-8) reqestMap= " + new String(reqestMap.toString().getBytes(), "UTF-8"));
			DEBUG_LOG.info("テスト(Shift-JIS) reqestMap= " + new String(reqestMap.toString().getBytes(), "Shift-JIS"));
			JSYwebLog.println(JSYLogBase.EXECUTION, this.getClass(), null, "BPCON0I002",  new String[]{"CNA005_050番号仮発行_reqestMap= " + reqestMap.toString()}, "");
			
			/************************
			 * ０５０番号仮発行CC呼出
			 ************************/
			// サービス呼び出しの際の引数を生成
			HashMap paramMap = new HashMap();
			HashMap inputMap = new HashMap();
			HashMap outputMap = new HashMap();
			// 返却用マップの作成と初期化
			Map returnMap  = createReturnMap();

			// サービスへのデータセット
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SERVICE_ID);
			paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, SERVICE_ID + "OP");
			
			createServiceMap(reqestMap, inputMap);

			// サービスの呼出(０５０番号仮発行)
			X31CMessageResult msgResult = invokeService(paramMap, inputMap, outputMap);
			
			// エラー処理 
			String errFlgAuth = (String)JCNWebCommon.getObjFromMap(outputMap, "JCN050KariHakkoCC.return_code");
//			String errFlgAuth = (String)getParamFromMap(outputMap, CC_NAME, "RETURN_CODE");
			if(msgResult != null)
			{
				createErrResultParam(bean, S_API_RTN_CD_SYS_ERR);
				DEBUG_LOG.info("０５０番号仮発行サービスにてエラーが発生しました。");
				return true;
			}
			else if(!S_API_RTN_CD_OK.equals(errFlgAuth))
			{
				createResultParam(bean, returnMap, outputMap);
				DEBUG_LOG.info("０５０番号仮発行サービスにてエラーが発生しました。");
				return true;
			}
			
			// 返却パラメータ設定
			createResultParam(bean, returnMap, outputMap);
			
		}
		catch (Exception e)
		{
			StringBuilder sb = new StringBuilder();
			StringWriter sw = new StringWriter();
			PrintWriter pw = new PrintWriter(sw);
			e.printStackTrace(pw);
			sb.append("\n" + sw.toString());
			DEBUG_LOG.info("CNA00501にてエラー(Exception)発生" + sb.toString());

			createErrResultParam(bean, S_API_RTN_CD_SYS_ERR);
		}
		DEBUG_LOG.info("action_Init End!");
		return true;
	}

	/**
	 * 返却パラメータ編集処理
	 * @param bean
	 * @param outMap
	 * @return String
	 */
	@SuppressWarnings("unchecked")
	private void createResultParam(X31SDataBeanAccess bean, Map returnMap, Map<?, ?> outMap) throws Exception
	{
		// xml形式出力タグ情報とOUTPUT情報の編集
		List retList = (List)returnMap.get("KARIHAKKO_TELNO_LIST");
		List list = (List)JCNWebCommon.getObjFromMap(outMap, "JCN050KariHakkoCC.n_050_telno_karihakko_list");
		
		String returnCd = (String)JCNWebCommon.getObjFromMap(outMap, "JCN050KariHakkoCC.return_code");
		String aplreqcd = (String)JCNWebCommon.getObjFromMap(outMap, "JCN050KariHakkoCC.n_050apl_hradsi_req_cd_in");
		returnMap.put("RETURN_CODE", returnCd);
		returnMap.put("APL_HRADSI_REQ_CD", aplreqcd);
		
		if (!isNullOrEmpty(list))
		{
			for (int i = 0; i < list.size(); i++)
			{
				Map listRecMap = (Map)list.get(i);
				Map retListRootMap = new HashMap();
				retList.add(retListRootMap);
				Map retBillMap = new LinkedHashMap();
				retListRootMap.put("KARIHAKKO_TELNO", retBillMap);
				retBillMap.put("TELNO_HRADSI_SBT_CD", listRecMap.get("n_050_telno_hradsi_sbt_cd"));
				retBillMap.put("TELNO", listRecMap.get("n_050_telno"));
			}
		}
		else
		{
			Map retListRootMap = new HashMap();
			retList.add(retListRootMap);
			Map retBillMap = new LinkedHashMap();
			retListRootMap.put("KARIHAKKO_TELNO", retBillMap);
			retBillMap.put("TELNO_HRADSI_SBT_CD", null);
			retBillMap.put("TELNO", null);
		}
		
		String xml = JCNWebCommon.parseMapToXmlForPmp(returnMap, 1).replaceAll("\r\n", "\n");
		bean.sendMessageString("返却データ", X31CWebConst.DATABEAN_SET_VALUE, xml);
		JSYwebLog.println(JSYLogBase.EXECUTION, this.getClass(), null, "BPCON0I002",  new String[]{"CNA005_050番号仮発行_returnMap= " + returnMap.toString()}, "");

	}
	
	/**
	 * View層エラー発生時返却パラメータ編集処理
	 * @param bean
	 * @return String
	 */
	private void createErrResultParam(X31SDataBeanAccess bean, String errCd) throws Exception
	{
		bean.sendMessageString(CNA00501SFConst.RETURN_CODE, X31CWebConst.DATABEAN_SET_VALUE, errCd);
	}
	
	/**
	 * サービスへのパラメータを作成する
	 * @param reqestMap
	 * @param inputMap
	 * @throws Exception
	 */
	private void createServiceMap(Map<String, String> reqestMap, Map<String, Object> inputMap) throws Exception
	{
		
		HashMap<String, Object> mapCc = new HashMap<String, Object>();
		
		mapCc.put("SYSID", getParameterToString(reqestMap, "SYSID"));
		mapCc.put("CONT_KEI_NO", getParameterToString(reqestMap, "CONT_KEI_NO"));
		mapCc.put("N_050APL_HRADSI_REQ_CD", getParameterToString(reqestMap, "APL_HRADSI_REQ_CD"));

		inputMap.put(CC_NAME, mapCc);

	}

	/**
	 * パラメータマップを解析し、キーに一致する値を返却する。
	 * @param requestParamMap
	 * @param keyName
	 * @return String
	 * @throws 処理中に発生した例外をスロー
	 */
	private static String getParameterToString(Map<String, String> requestParamMap, String keyName) throws Exception
	{
		String value = "";
		
		Iterator<?> keyIterator = requestParamMap.keySet().iterator();
		
		while(keyIterator.hasNext())
		{
			String key = (String)keyIterator.next();
			
			if(key.equals(keyName) ||  key.matches(keyName + "\\[[0-9]*\\]"))
			{
				value = requestParamMap.get(key);
			}
			
		}
		return new String(value.getBytes());
	}
	
	/**
	 * マップから指定されたキーの値を取得する。
	 * (使用例）<BR/>
	 *     getParamFromXml("LKA11020_RECEIVE", "PROCESS_DIV");<BR/>
	 * 
	 * @param map マップ
	 * @param allKeys キー名
	 * @return 値
	 */
	@SuppressWarnings("unchecked")
	public static Object getParamFromMap(Map map, String...allKeys)
	{

		Map nowMap = map;
		Object returnVal = null;
		for (int i = 0; i < allKeys.length; i++)
		{
			String key = allKeys[i];
			int idx = -1;
			if (key.matches("[a-zA-Z0-9_\\-]+\\[[0-9]+\\]"))
			{
				idx = new Integer(key.replaceFirst("^[a-zA-Z0-9_\\-]+\\[", "").replace("]", ""));
				key = key.replaceFirst("\\[[0-9]+\\]", "");
			}
			if (nowMap.containsKey(key))
			{
				Object val = nowMap.get(key);
				if ((val instanceof List) && (idx >= 0))
				{
					List nowList = (List)val;
					val = nowList.get(idx);
				}
				if (val instanceof Map)
				{
					nowMap = (Map)val;
				}
				if (i == allKeys.length - 1)
				{
					returnVal = val;
				}
			}
			else
			{
				return null;
			}
		}

		return returnVal;
	}
	
	/**
	 * メソッド名  ：null文字→空文字変換
	 * メソッド説明：対象文字列がnull文字の場合、空文字に変換して返す
	 * 備考    
	 * @param base 対象文字列
	 * @return 変換後文字列
	 */
	private static String replaceNullToBlank(String base)
	{
    	
    	// 引数の対象文字列がnullの場合
        if(base == null)
        {
        	// 空文字を返す
            return STR_BLANK;
        }
        
        // 引数の対象文字列がnullでない場合、そのまま返す
        return base;
    }
	/**
	 * メソッド名  ：null、空文字、空白文字（半角空白、全角空白）判定
	 * メソッド説明：：null、空文字、
	 *                     空白文字（半角空白、全角空白）の判定を行う
	 * 備考：
	 * @param strCheck　対象文字列
	 * @return true :対象文字列がnullもしくは空白文字（半角空白、全角空白）のみ
	 *          false:上記以外
	 */
    private static boolean isNullOrBlanks(String strCheck)
    {
		// 対象文字列が対象文字列がnullもしくは空文字の場合
    	if(isNullOrBlank(strCheck))
    	{
    		// trueを返す
        	return true;
        }
    	
    	// 全半角空白を空文字に置換
        String strRepTemp = strCheck.replaceAll(" ", "");
        String strRep = strRepTemp.replaceAll("　", "");
        
        // 空文字以外が存在する場合
        if(strRep.length() > 0)
        {
        	// falseを返す
        	return false;
        }
        
        // 空文字のみの場合、trueを返す
        return true;
	}
    /**
     * メソッド名  ：null、空文字判定
     * メソッド説明：nullもしくは空文字の判定を行う
     * 備考：
     * @param strCheck 対象文字列
     * @return true :対象文字列がnullもしくは空文字
     *          false:上記以外
     */
	private static boolean isNullOrBlank(String strCheck)
	{
		
		// 対象文字列が対象文字列がnullもしくは空文字の場合、trueを返す
    	return strCheck == null || STR_BLANK.equals(strCheck);
	}
	
	/**
	 * 返却用マップの作成と初期化<br />
	 * @return 返却用マップ
	 */
	@SuppressWarnings("unchecked")
	private Map createReturnMap()
	{
		Map returnMap  = new LinkedHashMap();
		returnMap.put("RETURN_CODE", "");
		returnMap.put("APL_HRADSI_REQ_CD", "");
		returnMap.put("KARIHAKKO_TELNO_LIST", new ArrayList());
		return returnMap;
	}
}
