/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：CNA00801SFLogic
*   ソースファイル名：CNA00801SFLogic.java
*   作成者          ：富士通
*   日付            ：2013年01月31日
*＜機能概要＞
*   ０５０初期設定完了を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/01/31   FJ          新規作成
*
**********************************************************************/
package eo.web.webview.CNA00801SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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;

/**
 * ０５０初期設定完了処理
 * @author FJ
 *
 */
@SuppressWarnings("serial")
public class CNA00801SFLogic 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 = "CNSV0047";
	
	/**
	 * サービスコンポーネント名
	 */
	private static final String CC_NAME = "JCN050InitCompCC";	
	
	/**
	 * 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"));
			
			/************************
			 * ０５０初期設定完了CC呼出
			 ************************/
			// サービス呼び出しの際の引数を生成
			HashMap paramMap = new HashMap();
			HashMap inputMap = new HashMap();
			HashMap outputMap = new HashMap();

			// サービスへのデータセット
			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)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, outputMap);
				DEBUG_LOG.info("０５０初期設定完了サービスにてエラーが発生しました。");
				return true;
			}
			
			// 返却パラメータ設定
			createResultParam(bean, 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("CNA00801にてエラー(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
	 */
	private void createResultParam(X31SDataBeanAccess bean, Map<?, ?> outMap) throws Exception
	{
		String returnCd = (String)getParamFromMap(outMap, CC_NAME, "RETRUN_CODE");
		
		bean.sendMessageString(CNA00801SFConst.RETRUN_CODE, X31CWebConst.DATABEAN_SET_VALUE, returnCd);
	}
	
	/**
	 * View層エラー発生時返却パラメータ編集処理
	 * @param bean
	 * @return String
	 */
	private void createErrResultParam(X31SDataBeanAccess bean, String errCd) throws Exception
	{
		bean.sendMessageString(CNA00801SFConst.RETRUN_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_HNIN_CFM_TELNO", getParameterToString(reqestMap, "APL_HNIN_CFM_TELNO"));
		mapCc.put("TANMT_USE_ENV_INFO", getParameterToString(reqestMap, "TANMT_USE_ENV_INFO"));
		mapCc.put("N_050APL_SHK_SETTE_RSLT_CD", getParameterToString(reqestMap, "APL_SHK_SETTE_RSLT_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);
	}
}
