/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：契約管理システム
*   モジュール名    ：異動区分選択
*   ソースファイル名：KKW00146SFLogic
*   作成者          ：富士通
*   日付            ：2011年9月30日
*＜機能概要＞
*   
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/09/30   FJ          新規作成
*   v4.00.00    2012/09/25   FJ          料金プラン体系の変更
*   v4.00.01    2012/10/10   FJ          「IT1-2012-00001191」お客様情報一覧画面には、料金プランコードを返却する。
*
**********************************************************************/

package eo.web.webview.CKW00102SF;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCScreenConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.mapping.CKSV0025_CKSV0025OPDBMapper;

/**
 * <dd>クラス名：CKW00102SFLogic
 * <dd>クラス説明：他システム選択を行う。
 * <dd>備考：なし。
 * @version 1.00.00 2011/09/30
 * @author FJ
 */
@SuppressWarnings("serial")
public class CKW00102SFLogic extends JCCWebBusinessLogic {

	/** 画面ID */
	private static final String SCREEN_ID_PPLAN_SELECT = "CKW00102";
	
	/** ユースケースＩＤ（料金プラン選択初期表示） */
	private static final String UCID_PPLAN_SEL_SHK_DSP= "CKSV0025";
	/** オペレーションＩＤ（料金プラン選択初期表示） */
	private static final String OPID_PPLAN_SEL_SHK_DSP= "CKSV0025OP";
	
	/** 機能コード */
	private static final String FUNC_CODE_1 = "1";
	
	/** 引継用料金プランコード取得用キー */
	private static final String HKTG_PPLAN_CD_KEY = "料金プラン";
	/** 引継用料金プラン明細取得用キー */
	private static final String HKTG_PPLAN_LIST_KEY = "料金プラン明細";
	/** 引継用料金プラン名取得用キー */
	private static final String HKTG_PPLAN_NM_KEY = "料金プラン名";
	/** 料金プラン複数選択時の引継用料金プラン名固定文字列 */
	private static final String FUKUSU_SELECT_STR = "複数選択あり";

	/**
	 * 初期表示処理
	 * 
	 * <dd>備考：なし。
	 * 
	 * @return true/false
	 * @throws Exception 
	 */
	public boolean actionInit() throws Exception {
		// 遷移元画面ID取得
		// 共有フォームビーンの取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		// 遷移先の画面IDを取得
		String screenId = commoninfoBean.sendMessageString( CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE );
		
		// 遷移先画面ID確認
		if (SCREEN_ID_PPLAN_SELECT.equals(screenId))
		{
			return actionPPlanSelectInit();
		}
		
		return true;
	}
	
	/**
	 * 料金プラン選択画面 初期表示
	 * @return true/false
	 * @throws Exception
	 */
	private boolean actionPPlanSelectInit() throws Exception {
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess[] paramBean = { bean };
		if (null == bean)
		{
			throw new Exception();
		}
		
		// ----------------------
		// 遷移元情報取得
		// ----------------------
		HashMap<String, Object> dataMap = JCCWebCommon.getScreenInfo(this);
		if (null == dataMap)
		{
			throw new Exception();
		}
		
		// 上りマッピング処理
		HashMap<String, Object> paramMap = new HashMap<String, Object>(); // パラメタ設定用マップ
		HashMap<String, Object> inputMap = new HashMap<String, Object>(); // 検索条件格納用マップ
		HashMap<String, Object> outputMap = new HashMap<String, Object>(); // 結果格納用マップ
		CKSV0025_CKSV0025OPDBMapper mapper = new CKSV0025_CKSV0025OPDBMapper(); // DataBean-BPマッパ
		
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, UCID_PPLAN_SEL_SHK_DSP);   // ユースケースID
		paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, OPID_PPLAN_SEL_SHK_DSP); // オペレーションID
		
		mapper.setCKSV002501SC(paramBean, inputMap, FUNC_CODE_1);
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		// ---------------
		// サービス実行
		// ---------------
		invokeService(paramMap, inputMap, outputMap);
		
		// 下りマッピング処理
		mapper.getCKSV002501SC(paramBean, outputMap);
		
		// 表示用料金プラン名の設定
		setDispPPlanNm(paramBean[0]);
		
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		return true;
	}

	private void setDispPPlanNm(X31SDataBeanAccess bean) {
		// 料金プラン情報Listの取得
		X31SDataBeanAccessArray pPlanList = bean.getDataBeanArray(CKW00102SFConst.PPLAN_DETAIL_LIST);

		// ▼▼▼▼▼ 2012/10/10 UPD 「IT1-2012-0001191」 START ▼▼▼▼▼
		// ▼▼▼▼▼ 2012/09/25 UPD 「ANK-1162-00-00」   START ▼▼▼▼▼
		// 料金プラン名集約リスト
		List<Map<String, String>> grpPplanNmList = new ArrayList<Map<String, String>>();

		// 料金プラン情報を集約する
		int count = pPlanList.getCount();
		for (int i = 0; i < count; i++)
		{
			X31SDataBeanAccess pPlanBean = pPlanList.getDataBean(i);
			// 料金プランコード取得
			String pplanCd  = pPlanBean.sendMessageString(CKW00102SFConst.PPLAN_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
			// 料金プラン名取得
			String pplanNm  = pPlanBean.sendMessageString(CKW00102SFConst.PPLAN_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

			// 集約リスト追加判定
			boolean listAddFlg = true;
			int listCnt = 0;
			while (listCnt < grpPplanNmList.size())
			{
				// 料金プラン名取得
				String grpPplanNm = ((Map<String, String>)grpPplanNmList.get(listCnt)).get(HKTG_PPLAN_NM_KEY);
				if (pplanNm.equals(grpPplanNm))
				{
					// すでに集約リストに存在する料金プラン名の場合は、追加しない
					listAddFlg = false;
					break;
				}
				listCnt++;
			}
			// 集約リストに追加する場合
			if (listAddFlg)
			{
				Map<String, String> workMap = new HashMap<String, String>();
				// 料金プランコード格納
				workMap.put(CKW00102SFConst.PPLAN_CD_01, pplanCd);
				// 料金プラン名格納
				workMap.put(CKW00102SFConst.PPLAN_NM_01, pplanNm);

				// 集約リストに追加
				grpPplanNmList.add(workMap);
			}
			// 集約リストにすでに存在する場合
			else
			{
				Map<String, String> workMap = (Map<String, String>)grpPplanNmList.get(listCnt);
				// 料金プランコード追加
				workMap.put(CKW00102SFConst.PPLAN_CD_01, workMap.get(CKW00102SFConst.PPLAN_CD_01) + "," + pplanCd);

				// 集約リストに格納
				grpPplanNmList.set(listCnt, workMap);
			}

		}

		// 料金プラン明細クリア
		pPlanList.clearArray();
		for (int listCnt = 0; listCnt < grpPplanNmList.size(); listCnt++)
		{
			X31SDataBeanAccess subbean = null;
			if (pPlanList.getCount() - 1 >= listCnt)
			{
				subbean = pPlanList.getDataBean(listCnt);
			}
			else
			{
				subbean = pPlanList.addDataBean();
			}
			Map<String, String> childMap = (Map<String, String>)grpPplanNmList.get(listCnt);
			if (subbean == null)
			{
				continue;
			}

			// 料金プラン明細.料金プランコード
			if (childMap != null) {
				subbean.sendMessageString(CKW00102SFConst.PPLAN_CD_01, X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get(CKW00102SFConst.PPLAN_CD_01));
			}
			else
			{
				subbean.sendMessageString(CKW00102SFConst.PPLAN_CD_01, X31CWebConst.DATABEAN_SET_VALUE, new String());
			}
			// 料金プラン明細.料金プラン名
			if (childMap != null) {
				subbean.sendMessageString(CKW00102SFConst.PPLAN_NM_01,      X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get(CKW00102SFConst.PPLAN_NM_01));
				subbean.sendMessageString(CKW00102SFConst.DISP_PPLAN_NM_01, X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get(CKW00102SFConst.PPLAN_NM_01));
			}
			else
			{
				subbean.sendMessageString(CKW00102SFConst.PPLAN_NM_01,      X31CWebConst.DATABEAN_SET_VALUE, new String());
				subbean.sendMessageString(CKW00102SFConst.DISP_PPLAN_NM_01, X31CWebConst.DATABEAN_SET_VALUE, new String());
			}
		}
		// ▲▲▲▲▲ 2012/09/25 UPD 「ANK-1162-00-00」   E N D ▲▲▲▲▲
		// ▲▲▲▲▲ 2012/10/10 UPD 「IT1-2012-0001191」 E N D ▲▲▲▲▲
	}

/*
	private void setPPlanData(X31SDataBeanAccess bean) {

		// 料金グループ情報Listの取得
		X31SDataBeanAccessArray prcGrpList = bean.getDataBeanArray(CKW00102SFConst.PRC_GRP_DETAIL_LIST);
		
		// 料金プラン情報Listの取得
		X31SDataBeanAccessArray pPlanList = bean.getDataBeanArray(CKW00102SFConst.PPLAN_DETAIL_LIST);
		
		// 表示用料金プラン情報Listの取得
		X31SDataBeanAccessArray targetPPlanList = bean.getDataBeanArray(CKW00102SFConst.TARGET_PPLAN_DETAILLIST);
		
		// 対象グループコードの取得
		List<String> targetGrpList = new ArrayList<String>();
		int count = prcGrpList.getCount();
		for (int i = 0; i < count; i++)
		{
			X31SDataBeanAccess prcGrpBean = prcGrpList.getDataBean(i);
			String targetGrpCd
				= prcGrpBean.sendMessageString(CKW00102SFConst.PRC_GRP_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
			targetGrpList.add(targetGrpCd);
		}
		
		// 対象グループコードに属する料金プラン情報の取得
		count = pPlanList.getCount();
		int index = 0;
		int dispNum = 0;
		for (int i = 0; i < count; i++) {
			X31SDataBeanAccess pPlanBean = pPlanList.getDataBean(i);
			String grpCd = pPlanBean.sendMessageString(CKW00102SFConst.PRC_GRP_CD_02, X31CWebConst.DATABEAN_GET_VALUE);
			if (targetGrpList.contains(grpCd)) {
				X31SDataBeanAccess targetPPlanBean = null;
				if (targetPPlanList.getCount() > index)
				{
					targetPPlanBean = targetPPlanList.getDataBean(index);
				} else {
					targetPPlanBean = targetPPlanList.addDataBean();
				}
				index++;
				// 料金プラン選択の設定
				targetPPlanBean.sendMessageBoolean(CKW00102SFConst.PPLAN_SELECT_03, X31CWebConst.DATABEAN_SET_VALUE, false);
				// 料金コースコードの設定
				targetPPlanBean.sendMessageString(CKW00102SFConst.PCRS_CD_03, X31CWebConst.DATABEAN_SET_VALUE, 
						pPlanBean.sendMessageString(CKW00102SFConst.PCRS_CD_02, X31CWebConst.DATABEAN_GET_VALUE));
				// 料金コース名の選択
				targetPPlanBean.sendMessageString(CKW00102SFConst.PCRS_NM_03, X31CWebConst.DATABEAN_SET_VALUE, 
						pPlanBean.sendMessageString(CKW00102SFConst.PCRS_NM_02, X31CWebConst.DATABEAN_GET_VALUE));
				// 料金プランコードの設定
				targetPPlanBean.sendMessageString(CKW00102SFConst.PPLAN_CD_03, X31CWebConst.DATABEAN_SET_VALUE,
						pPlanBean.sendMessageString(CKW00102SFConst.PPLAN_CD_02, X31CWebConst.DATABEAN_GET_VALUE));
				// 料金プラン名の設定
				dispNum++;
				String dispNumStr = getNumStr(dispNum);
				targetPPlanBean.sendMessageString(CKW00102SFConst.PPLAN_NM_03, X31CWebConst.DATABEAN_SET_VALUE,
						dispNumStr + ". " + pPlanBean.sendMessageString(CKW00102SFConst.PPLAN_NM_02, X31CWebConst.DATABEAN_GET_VALUE));
			}
		}
	}
*/
	
	/**
	 * 選択項目の前につける番号を生成<br>
	 * (番号は3桁で頭0埋め、999まで対応)
	 * @param dispNum 生成対象の番号
	 * @return 番号の文字列
	 */
	private String getNumStr(int dispNum) {
		if (10 > dispNum)
		{
			return "00" + String.valueOf(dispNum);
		}
		
		if (100 > dispNum)
		{
			return "0" + String.valueOf(dispNum);
		}
		
		return String.valueOf(dispNum);
	}

	/**
	 * 選択ボタン押下処理
	 * @return
	 * @throws Exception
	 */
	public boolean actionChoice() throws Exception {
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		if (null == bean)
		{
			throw new Exception();
		}
		
		// 料金プラン情報Listの取得
		X31SDataBeanAccessArray pPlanList = bean.getDataBeanArray(CKW00102SFConst.PPLAN_DETAIL_LIST);
		int count = pPlanList.getCount();
		// 引継用料金コード格納用
		List<String> pplanCdList = new ArrayList<String>();
		// 引継用料金プラン名格納用
		String pplanNm = "";
		// 選択数カウント用
		int selCount = 0;
		for (int i=0; i<count; i++)
		{
			X31SDataBeanAccess pPlanBean = pPlanList.getDataBean(i);
			boolean fl = pPlanBean.sendMessageBoolean(
							CKW00102SFConst.PPLAN_SELECT_01, X31CWebConst.DATABEAN_GET_VALUE);
			if (fl)
			{
				// 2012/06/26 IT2-2012-0001010 MOD START プランコードに変更
				//pcrsCdList.add(pPlanBean.sendMessageString(CKW00102SFConst.PCRS_CD_01, X31CWebConst.DATABEAN_GET_VALUE));
				// ▼▼▼▼▼ 2012/10/10 UPD 「IT1-2012-0001191」 START ▼▼▼▼▼
				// ▼▼▼▼▼ 2012/09/25 UPD 「ANK-1162-00-00」   START ▼▼▼▼▼
				//pplanCdList.add(pPlanBean.sendMessageString(CKW00102SFConst.PPLAN_CD_01, X31CWebConst.DATABEAN_GET_VALUE));
				String[] pplanCdAry = pPlanBean.sendMessageString(CKW00102SFConst.PPLAN_CD_01, X31CWebConst.DATABEAN_GET_VALUE).split(",");
				for (int listCnt = 0; listCnt < pplanCdAry.length; listCnt++)
				{
					pplanCdList.add(pplanCdAry[listCnt]);
				}
				// ▲▲▲▲▲ 2012/09/25 UPD 「ANK-1162-00-00」   E N D ▲▲▲▲▲
				// ▲▲▲▲▲ 2012/10/10 UPD 「IT1-2012-0001191」 E N D ▲▲▲▲▲
				// 2012/06/26 IT2-2012-0001010 MOD END
				pplanNm = pPlanBean.sendMessageString(CKW00102SFConst.PPLAN_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

				selCount++;
			}
		}
		
		// 引継用の料金コースコード設定
		ArrayList<HashMap<String, Object>> dataArray = new ArrayList<HashMap<String, Object>>();
		for (int i=0; i<pplanCdList.size(); i++)
		{
			HashMap<String, Object> childMap = new HashMap<String, Object>();
			childMap.put(HKTG_PPLAN_CD_KEY, pplanCdList.get(i));
			dataArray.add(childMap);
		}
		
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		dataMap.put(HKTG_PPLAN_LIST_KEY, dataArray);
		
		// 引継用の料金プラン名の設定
		if (1 < selCount)
		{
			pplanNm = FUKUSU_SELECT_STR;
		}
		dataMap.put(HKTG_PPLAN_NM_KEY, pplanNm);
		
		String parentScreenId = JCCWebCommon.getScreenId( this );
		JCCWebCommon.setScreenInfo(this, parentScreenId, dataMap);
		
		JSYwebLog.println(JSYwebLog.DEBUG, getClass(), JCCWebCommon.getScreenInfo(this, parentScreenId), null, null, null);

		// ----------------------------
		// 遷移先画面情報
		// ----------------------------
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
//		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, 
//										JCCWebCommon.getScreenId(this));
		
		// 遷移先画面IDを設定
		commoninfoBean.sendMessageString( CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
										JCCScreenConst.SCREEN_ID_CCW00105 );
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString( CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
										JCCScreenConst.SCREEN_NAME_CCW00105 );
		
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);

		return true;
	}
}
