/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUMskmshoDtlNoSibnCC
*   ソースファイル名：JFUMskmshoDtlNoSibnCC.java
*   作成者          ：富士通
*   日付            ：2012年10月18日
*＜機能概要＞
*   申込書明細番号採番コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2012/10/18   FJ)山下     新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.common.JCMConstants;

import eo.ejb.cbs.cbsmsg.EKK0021C014CBSMsg;

/**
 * 申込断面登録コモンコンポーネント部品.
 * <br>
 * @author 富士通
 */
public class JFUMskmshoDtlNoSibnCC extends JFUBaseCC
{
	/** テンプレートID */
	private static final String TEMPLATE_ID = "JFUMskmshoDtlNoSibnCC";
	
	private static final String KEY_MSKMSHO_DTL_NO_NET = "mskmsho_dtl_no_net";
	private static final String KEY_MSKMSHO_DTL_NO_TEL = "mskmsho_dtl_no_tel";
	private static final String KEY_MSKMSHO_DTL_NO_TV = "mskmsho_dtl_no_tv";
	private static final String KEY_MSKMSHO_DTL_NO_MOBILE = "mskmsho_dtl_no_mobile";
	
	private static final String SVC_KBN_NET = "NET";
	private static final String SVC_KBN_TEL = "TEL";
	private static final String SVC_KBN_TV = "TV";
	private static final String SVC_KBN_MOBILE = "MOBILE";
	
	
	/** サービスインターフェイスID：申込書明細番号採番 */
	private static final String SVIF_ID_EKK0021C014 = "EKK0021C014";

	/** 申込書明細番号 IN項目リスト */
	private static final List<String> IN_COLUMN_LIST_EKK0021C014 = Arrays.asList(
			EKK0021C014CBSMsg.SVC_TIKI_CD, // サービス体系コード
			EKK0021C014CBSMsg.MSKM_FORM_CD, // 申込形態コード
			EKK0021C014CBSMsg.YMD);// 年月日

	/**
	 * 申込書明細番号採番処理.<br>
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception Exception
	 */
	public IRequestParameterReadWrite executeMskmshoDtlNoSibn(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{

		// リクエストパラメータ取得
		HashMap<String, Object> requestMap = (HashMap<String, Object>) param.getData(TEMPLATE_ID);
		
		// リクエストパラメータチェック処理
		this.checkRequestParam(requestMap);
		
		// eo光ネット採番処理実行判定
		if (this.reqChkEoNetSibn(requestMap))
		{
			
			// 上りマッピング
			this.setEKK0021C014(param, requestMap, SVC_KBN_NET);
			
			// 申込書明細番号採番インターフェイス呼出
			super.executeSC(handle, param, SVIF_ID_EKK0021C014, SVIF_ID_EKK0021C014, BLANK, IN_COLUMN_LIST_EKK0021C014, BLANK);
			
			// 下りマッピング
			this.getEKK0021C014(param, requestMap, SVC_KBN_NET);
		}
		
		// eo光電話採番処理実行判定
		if (this.reqChkEoTelSibn(requestMap))
		{
			// 上りマッピング
			this.setEKK0021C014(param, requestMap, SVC_KBN_TEL);
			
			// 申込書明細番号採番インターフェイス呼出
			super.executeSC(handle, param, SVIF_ID_EKK0021C014, SVIF_ID_EKK0021C014, BLANK, IN_COLUMN_LIST_EKK0021C014, BLANK);
		}
		
		// 下りマッピング
		this.getEKK0021C014(param, requestMap, SVC_KBN_TEL);
	
		
		// eo光テレビ採番処理実行判定
		if (this.reqChkEoTvSibn(requestMap))
		{
			// 上りマッピング
			this.setEKK0021C014(param, requestMap, SVC_KBN_TV);
			
			// 申込書明細番号採番インターフェイス呼出
			super.executeSC(handle, param, SVIF_ID_EKK0021C014, SVIF_ID_EKK0021C014, BLANK, IN_COLUMN_LIST_EKK0021C014, BLANK);
		
			// 下りマッピング
			this.getEKK0021C014(param, requestMap, SVC_KBN_TV);
		}
		
		// eoモバイル採番処理実行判定
		if (this.reqChkEoMobileSibn(requestMap))
		{
			// 上りマッピング
			this.setEKK0021C014(param, requestMap, SVC_KBN_MOBILE);
			
			// 申込書明細番号採番インターフェイス呼出
			super.executeSC(handle, param, SVIF_ID_EKK0021C014, SVIF_ID_EKK0021C014, BLANK, IN_COLUMN_LIST_EKK0021C014, BLANK);
		
			// 下りマッピング
			this.getEKK0021C014(param, requestMap, SVC_KBN_MOBILE);
		}

		return param;
	}
	
	/**
	 * リクエストパラメータのチェックを行う。
	 * @param requestMap リクエストパラメータ
	 * @throws CCException
	 */
	private void checkRequestParam(HashMap<String, Object> requestMap) throws CCException
	{
		
		// リクエストパラメータが設定されていない場合
		if (requestMap == null)
		{
			throw new CCException("申込書明細番号採番CCのマッピングがありません。", new Exception());
		}
		
		// 申込回線サービスが設定されていない場合
		if (!requestMap.containsKey("mskm_ksn_svc") || isBlank(requestMap.get("mskm_ksn_svc")))
		{
			throw new CCException("申込回線サービスが設定されていません。", new Exception());
		}
		
		// 申込回線サービスがホームタイプ、または、マンションタイプ、または、モバイル単独申込以外の場合
		if (!"1".equals(requestMap.get("mskm_ksn_svc").toString()) && !"2".equals(requestMap.get("mskm_ksn_svc").toString()) && !"3".equals(requestMap.get("mskm_ksn_svc").toString()))
		{
			throw new CCException("申込回線サービスの値が不正です。mskm_ksn_svc = " + requestMap.get("mskm_ksn_svc").toString(), new Exception());
		}
		
		// 申込回線サービスがマンションタイプの場合
		if ("2".equals(requestMap.get("mskm_ksn_svc").toString()))
		{
			
			// 申込マンションタイプが設定されていない場合
			if (!requestMap.containsKey("mskm_mns_type") || isBlank(requestMap.get("mskm_mns_type")))
			{
				throw new CCException("申込マンションタイプが設定されていません。", new Exception());
			}
			
			// 申込マンションタイプがマンション、または、メゾン以外の場合
			if (!"1".equals(requestMap.get("mskm_mns_type").toString()) && !"2".equals(requestMap.get("mskm_mns_type").toString()))
			{
				throw new CCException("申込マンションタイプの値が不正です。mskm_mns_type = " + requestMap.get("mskm_mns_type").toString(), new Exception());
			}
		}
		
		// 販売タイプが設定されていない場合
		if (!requestMap.containsKey("hanbai_type") || isBlank(requestMap.get("hanbai_type")))
		{
			throw new CCException("販売タイプが設定されていません。", new Exception());
		}
		
		// 販売タイプが、コンシューマー、または、量販・訪販以外の場合
		if (!"0".equals(requestMap.get("hanbai_type").toString()) && 
				!"1".equals(requestMap.get("hanbai_type").toString()) && 
				!"2".equals(requestMap.get("hanbai_type").toString()) &&
				!"3".equals(requestMap.get("hanbai_type").toString()))
		{
			throw new CCException("販売タイプの値が不正です。hanbai_type = " + requestMap.get("hanbai_type").toString(), new Exception());
		}
	}
	
	/**
	 * eo光ネットの採番処理実行判定を行う。
	 * @param requestMap リクエストパラメータ
	 * @return 実行判定結果
	 */
	private boolean reqChkEoNetSibn(HashMap<String, Object> requestMap)
	{
		// 選択サービス（ネット）が"1"(選択中)の場合
		if (requestMap.containsKey("select_svc_net") && "1".equals(requestMap.get("select_svc_net").toString()))
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * eo光電話の採番処理実行判定を行う。
	 * @param requestMap リクエストパラメータ
	 * @return 実行判定結果
	 */
	private boolean reqChkEoTelSibn(HashMap<String, Object> requestMap)
	{
		boolean isSelectNet = false;
		// 選択サービス（ネット）が"1"(選択中)の場合
		if (requestMap.containsKey("select_svc_net") && "1".equals(requestMap.get("select_svc_net").toString()))
		{
			isSelectNet = true;
		}
		
		// 選択サービス（ネット）が未選択の場合、かつ、選択サービス（電話）が"1"(選択中)の場合
		if (!isSelectNet && requestMap.containsKey("select_svc_tel") && "1".equals(requestMap.get("select_svc_tel").toString()))
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * eo光テレビの採番処理実行判定を行う。
	 * @param requestMap リクエストパラメータ
	 * @return 実行判定結果
	 */
	private boolean reqChkEoTvSibn(HashMap<String, Object> requestMap)
	{
		// 選択サービス（テレビ）が"1"(選択中)の場合
		if (requestMap.containsKey("select_svc_tv") && "1".equals(requestMap.get("select_svc_tv").toString()))
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * eoモバイルの採番処理実行判定を行う。
	 * @param requestMap リクエストパラメータ
	 * @return 実行判定結果
	 */
	private boolean reqChkEoMobileSibn(HashMap<String, Object> requestMap)
	{
		// モバイルコースが"0"(選択なし)でない、かつ、空白でない場合
		if (requestMap.containsKey("mobile_course") && 
				!isBlank(requestMap.get("mobile_course")) && !"0".equals(requestMap.get("mobile_course").toString()))
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * リクエストパラメータの値から、申込形態コードを判定し、返却する。
	 * @param requestMap リクエストパラメータ
	 * @return 申込形態コード
	 */
	private String getMskmFormCd(HashMap<String, Object> requestMap)
	{
		
		String hanbaiType = requestMap.get("hanbai_type").toString();
		
		if ("0".equals(hanbaiType))
		{
			return "01";
		}
		
		else if ("1".equals(hanbaiType))
		{
			return "02";
		}
		
		// 提携住宅会社
		else if ("3".equals(hanbaiType))
		{
			return "06";
		}
		
		else
		{
			return "03";
		} 
	}
	
	/**
	 * リクエストパラメータの値から、eo光ネット採番用のサービス体系コードを判定し、返却する。
	 * @param requestMap リクエストパラメータ
	 * @return svcTikiCd サービス体系コード(eo光ネット用)
	 */
	private String getSvcTikiCdEoNet(HashMap<String, Object> requestMap)
	{
		
		// 申込回線サービスを取得
		String mskmKsnSvc = requestMap.get("mskm_ksn_svc").toString();
		
		// ホームタイプの場合
		if ("1".equals(mskmKsnSvc))
		{
			return "W";
		}
		
		// マンションタイプの場合
		else 
		{
			
			// 申込マンションタイプを取得
			String mskmMnsType = requestMap.get("mskm_mns_type").toString();
			
			// マンションの場合
			if ("1".equals(mskmMnsType))
			{
				return "K";
			}
			
			// メゾンの場合
			else
			{
				return "Y";
			}
		}
	}
	
	/**
	 * リクエストパラメータの値から、eo光電話採番用のサービス体系コードを判定し、返却する。
	 * @param requestMap リクエストパラメータ
	 * @return サービス体系コード(eo光電話用)
	 */
	private String getSvcTikiCdEoTel(HashMap<String, Object> requestMap)
	{
		// ネットが契約されている場合
		if (requestMap.containsKey("now_svc_net") && "1".equals(requestMap.get("now_svc_net")))
		{
			return "T";
		}
		
		else
		{
			// 電話追加申込以外の場合、ネットと同じサービス体系コードを返却する。
			return this.getSvcTikiCdEoNet(requestMap);
		}
	}
	
	/**
	 * リクエストパラメータの値から、eo光テレビ採番用のサービス体系コードを判定し、返却する。
	 * @param requestMap リクエストパラメータ
	 * @return サービス体系コード(eo光テレビ用)
	 */
	private String getSvcTikiCdEoTv(HashMap<String, Object> requestMap)
	{
		
		// 申込回線サービスを取得
		String mskmKsnSvc = requestMap.get("mskm_ksn_svc").toString();
		
		// ホームタイプの場合
		if ("1".equals(mskmKsnSvc))
		{
			return "C";
		}
		
		// マンションタイプの場合
		else 
		{
			
			// 申込マンションタイプを取得
			String mskmMnsType = requestMap.get("mskm_mns_type").toString();
			
			// マンションの場合
			if ("1".equals(mskmMnsType))
			{
				return "L";
			}
			
			// メゾンの場合
			else
			{
				return "Z";
			}
		}
	}
	
	/**
	 * EKK0021C014へ上りマッピング
	 * 
	 * @param param リクエストパラメータ
	 * @param requestMap リクエストパラメータ
	 * @param svcKbn 申込書明細番号採番実施サービス区分(ネット、電話、テレビ、モバイル)
	 * @throws RequestParameterException
	 * @throws CCException
	 * @throws IOException 
	 * @throws ParserConfigurationException 
	 * @throws SAXException 
	 */
	private void setEKK0021C014(IRequestParameterReadWrite param, HashMap<String, Object> requestMap, String svcKbn) 
	throws RequestParameterException, CCException, SAXException,
			ParserConfigurationException, IOException
	{

		// 上りマッピング
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(SVIF_ID_EKK0021C014);

		if (inMap == null)
		{
			inMap = new HashMap();

			param.setData(SVIF_ID_EKK0021C014, inMap);
		}

		// 機能コード 1固定
		inMap.put(JCMConstants.FUNC_CODE_KEY, "1");

		// サービス体系コード
		String svcTikiCd = null;
		
		// eo光ネットの採番の場合
		if (SVC_KBN_NET.equals(svcKbn))
		{
			// eo光ネットのサービス体系コードを取得する。
			svcTikiCd = this.getSvcTikiCdEoNet(requestMap);
		}
		// eo光電話の採番の場合
		else if (SVC_KBN_TEL.equals(svcKbn))
		{
			// eo光電話のサービス体系コードを取得する。
			svcTikiCd = this.getSvcTikiCdEoTel(requestMap);
		}
		// eo光テレビの採番の場合
		else if (SVC_KBN_TV.equals(svcKbn))
		{
			// eo光テレビのサービス体系コードを取得する。
			svcTikiCd = this.getSvcTikiCdEoTv(requestMap);
		}
		// eoモバイルの採番の場合
		else 
		{
			// "S"固定
			svcTikiCd = "S";
		}
		
		// サービス体系コードをマッピング
		inMap.put(EKK0021C014CBSMsg.SVC_TIKI_CD, svcTikiCd);

		// 申込形態コードをマッピング(WEB、量販、訪販)
		inMap.put(EKK0021C014CBSMsg.MSKM_FORM_CD, this.getMskmFormCd(requestMap));

		// 年月日をマッピング(運用日付)
		inMap.put(EKK0021C014CBSMsg.YMD, JFUBPCommon.getOpeDate(null));
	}

	/**
	 * EKK0021C014の下りマッピングを行う。
	 * @param param リクエストパラメータ
	 * @param requestMap 当CCのマップ
	 * @param svcKbn サービス区分
	 * @throws RequestParameterException
	 */
	private void getEKK0021C014(IRequestParameterReadWrite param, HashMap<String, Object> requestMap, String svcKbn) throws RequestParameterException
	{
		
		HashMap<String, Object> ekk0021C014ResultMap = (HashMap<String, Object>) param.getData(SVIF_ID_EKK0021C014);
		
		if (ekk0021C014ResultMap == null)
		{
			return;
		}
		
		String key_mskmsho_dtl_no = "";
		
		boolean isCopyNetNo = false;
		
		if (SVC_KBN_NET.equals(svcKbn))
		{
			key_mskmsho_dtl_no = KEY_MSKMSHO_DTL_NO_NET;
		}
		
		else if (SVC_KBN_TEL.equals(svcKbn))
		{
			key_mskmsho_dtl_no = KEY_MSKMSHO_DTL_NO_TEL;
			
			boolean isSelectNet = false;
			// 選択サービス（ネット）が"1"(選択中)の場合
			if (requestMap.containsKey("select_svc_net") && "1".equals(requestMap.get("select_svc_net").toString()))
			{
				isSelectNet = true;
			}
			
			boolean isContractNet = false;
			// ネットが契約されている場合
			if (requestMap.containsKey("now_svc_net") && "1".equals(requestMap.get("now_svc_net")))
			{
				isContractNet = true;
			}
			
			// ネットと同時申込の場合
			if (isSelectNet && !isContractNet)
			{
				// ネットの申込書明細番号を電話にコピーする。
				isCopyNetNo = true;
			}
		}
		
		else if (SVC_KBN_TV.equals(svcKbn))
		{
			key_mskmsho_dtl_no = KEY_MSKMSHO_DTL_NO_TV;
		}
	
		else if (SVC_KBN_MOBILE.equals(svcKbn))
		{
			key_mskmsho_dtl_no = KEY_MSKMSHO_DTL_NO_MOBILE;
		}
		
		else
		{
			return;
		}
		
		if (!isCopyNetNo)
		{
			requestMap.put(key_mskmsho_dtl_no, ekk0021C014ResultMap.get("mskmsho_dtl_no").toString());
		}
		else
		{
			requestMap.put(key_mskmsho_dtl_no, requestMap.get(KEY_MSKMSHO_DTL_NO_NET).toString());
		}
	}
	
	/**
	 * チェック処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@Override
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}
	
	/**
	 * 空白判定を行う
	 * @param obj 判定対象オブジェクト
	 * @return 判定結果
	 */
	private boolean isBlank(Object obj)
	{
		
		if (obj == null)
		{
			return true;
		}
		
		if (obj instanceof String)
		{
			return "".equals(obj.toString());
		}
		
		return false;
	}
}
