/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：DKW02701SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年10月15日
*＜機能概要＞
*   強制機器出荷一覧照会を処理するロジッククラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/10/25   FJ          新規作成
*
**********************************************************************/
package eo.web.webview.DKW02701SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.common.constant.JPCModelConstant.FUNC_CD_1;
import static eo.web.webview.DKW02701SF.DKW02701SFConst.*;
import static eo.web.webview.common.JDKScreenConst.*;
import static eo.web.webview.common.JDKWebCommon.appendPrefix;
import static eo.web.webview.common.JDKWebCommon.clearPullDown;
import static eo.web.webview.common.JDKWebCommon.getBean;
import static eo.web.webview.common.JDKWebCommon.getData;
import static eo.web.webview.common.JDKWebCommon.getDataL;
import static eo.web.webview.common.JDKWebCommon.setData;
import static eo.web.webview.common.JDKWebCommon.storePullDown;
import static eo.web.webview.common.JDKWebCommon.substr;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JPCModelConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.DKW02702SF.DKW02702SFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JDKScreenConst;
import eo.web.webview.mapping.DKSV0109_DKSV0109OPDBMapper;
import eo.web.webview.mapping.DKSV0110_DKSV0110OPDBMapper;
import eo.common.util.JDKCommonUtil;

/**
 * 強制機器出荷一覧照会を処理するロジッククラスです。
 * @author 富士通
 */
public class DKW02701SFLogic extends JCCWebBusinessLogic 
{

	/** シリアル番号 */
	private static final long serialVersionUID = 1L;

	// 画面モード
	/** 検索機能 */
	private static final long SEARCH_MODE = 0;
	/** 一覧機能 */
	private static final long SEARCH_RESULT_MODE = 1;

	// サービス
	/** 強制機器出荷一覧照会初期表示 */
	private static final String DKSV0109 = "DKSV0109";
	/** 強制機器出荷一覧照会 */
	private static final String DKSV0110 = "DKSV0110";

	/** セッションに保管する文字列データのキー */
	private static final String [] SEARCH_CONDITION_STRING_KEIES = {SEARCH_SVKEI_NO
																	, SEARCH_TTM_NM_CHBF
																	, SEARCH_MDL_NO
																	, SEARCH_SHELF_NM
																	};
	/** プルダウン一覧 */
	private static final String [] PULLDOWNS = new String [] {I_TTM_NM_CHBF,
																I_MDL_NO,
																I_SHELF_NM};

	/** 明細マップ */
	private static final HashMap<String, String> DETAIL_MAP;
	static {
		DETAIL_MAP = new HashMap<String, String>();
		DETAIL_MAP.put(DKW02702SFConst.KEY_KKTK_SVC_KEI_NO,   L_KKTK_SVKEI_NO_02);
		DETAIL_MAP.put(DKW02702SFConst.KEY_KIKI_CHG_NO,       L_KIKI_CHG_NO_02);
		DETAIL_MAP.put(DKW02702SFConst.SVC_KEI_NO,            L_SVKEI_NO_02);
		DETAIL_MAP.put(DKW02702SFConst.CUST_NM,               L_CUST_NM_02);
		DETAIL_MAP.put(DKW02702SFConst.KEI_SVC_NM,            L_KEI_SVC_02);
		DETAIL_MAP.put(DKW02702SFConst.KEI_STAT_NM,           L_KEI_STAT_02);
		DETAIL_MAP.put(DKW02702SFConst.MODEL_NO,              L_MDL_NO_02);
		DETAIL_MAP.put(DKW02702SFConst.SOKO_CD,               L_TTM_CD_CHBF_02);
		DETAIL_MAP.put(DKW02702SFConst.SOKO_NM,               L_TTM_NM_CHBF_02);
		DETAIL_MAP.put(DKW02702SFConst.SHELF_NM,              L_SHELF_NM_02);
	}
	
	/** 型番号リスト */
	private static final List<String> MODEL_NO_LIST;
	static {
		MODEL_NO_LIST = new ArrayList<String>();
		MODEL_NO_LIST.add(L_TKKIKI_MDL_CD_02);
		MODEL_NO_LIST.add(L_HZKHIN_MDL_CD_02);
	}
	
	/**
	 * 初期化処理を行います。
	 * @return 処理実行結果
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{
		X31SDataBeanAccess bean = super.getServiceFormBean();
		setNextScreen(SCREEN_ID_DKW02701, SCREEN_NAME_DKW02701);
		
		X31SDataBeanAccess[] paramBean = {bean};
		
		HashMap paramMap = new HashMap();
		HashMap inputMap = new HashMap();
		HashMap outputMap = new HashMap();

		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, DKSV0109);
		DKSV0109_DKSV0109OPDBMapper mapper = new DKSV0109_DKSV0109OPDBMapper();
		X31CMessageResult msgResult = invokeService(paramMap, inputMap, outputMap);
		
		if(msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return true;
		}

		mapper.getDKSV010901SC(paramBean, outputMap);
		mapper.getDKSV010902SC(paramBean, outputMap);
		mapper.getDKSV010903SC(paramBean, outputMap);

		pushEmptyToTopOfPulldown(I_TTM_NM_CHBF, I_CD_CD_LIST_01, I_CD_NM_LIST_01, "");
		pushEmptyToTopOfPulldown(I_MDL_NO, I_CD_CD_LIST_01, I_CD_NM_LIST_01, "");
		pushEmptyToTopOfPulldown(I_SHELF_NM, I_CD_CD_LIST_01, I_CD_NM_LIST_01, "");

		setScreenMode(SEARCH_MODE);
		if (!restoreConditionFromSession())
		{
			return true;
		}

		restoreSearchCondition();
		storeSearchCondition();
		if (!innerSearch(FUNC_CD_1, SEARCH_RSLT_LIST, true))
		{
			return true;
		}

		setScreenMode(SEARCH_RESULT_MODE);
		String selectedNo = getData(this, SELECTED_KKTK_SVKEI_NO);
		X31SDataBeanAccessArray list = getServiceFormBean().getDataBeanArray(SEARCH_RSLT_LIST);
		int length = list.getCount();
		for (int i = 0;i < length;i++)
		{
			String noOnLine = getData(list.getDataBean(i), L_KKTK_SVKEI_NO_02);
			if (noOnLine.equals(selectedNo))
			{
				setData(this, (long)i, I_CHOICE);
				break;
			}
		}
		
		return true;
	}

	/**
	 * 検索処理を行います。
	 * @return 処理実行結果
	 */
	public boolean search() throws Exception
	{
		storeSearchCondition();
		JCCWebCommon.clearPageLinkInfo(this, SCREEN_ID_DKW02701);
		boolean errorOnSearch = innerSearch(FUNC_CD_1, SEARCH_RSLT_LIST, true);
		setScreenMode(errorOnSearch ? SEARCH_RESULT_MODE : SEARCH_MODE);
		setNextScreen(SCREEN_ID_DKW02701, SCREEN_NAME_DKW02701);
		return true;
	}

	/**
	 * 選択処理を行います。
	 * @return 処理実行結果
	 */
	@SuppressWarnings("unchecked")
	public boolean detail() 
	{
		HashMap detailMap = new HashMap();
		for (String key : DETAIL_MAP.keySet())
		{
			detailMap.put(key, getSelectedData(DETAIL_MAP.get(key)));
		}
//		detailMap.put(DKW02702SFConst.ID_TO_RETURN, SCREEN_ID_DKW02701);
//		detailMap.put(DKW02702SFConst.NAME_TO_RETURN, SCREEN_NAME_DKW02701);
		
		JCCWebCommon.setScreenInfo(this, JDKScreenConst.SCREEN_ID_DKW02702 + "0PJP", detailMap);
		JCCWebCommon.setScreenId(this, JDKScreenConst.SCREEN_ID_DKW02702 + "0PJP", getGamenId());

		HashMap myMap = new HashMap();
		for (String key : SEARCH_CONDITION_STRING_KEIES)
		{
			myMap.put(key, getData(this, key));
		}
		myMap.put(SELECTED_KKTK_SVKEI_NO, getSelectedData(L_KKTK_SVKEI_NO_02));

		JCCWebCommon.setScreenInfo(this, JDKScreenConst.SCREEN_ID_DKW02701 + "0PJP", myMap);
		JCCWebCommon.setScreenId(this, JDKScreenConst.SCREEN_ID_DKW02701 + "0PJP", getGamenId());
		
		setNextScreen(SCREEN_ID_DKW02702, SCREEN_NAME_DKW02702);
		return true;
	}

	/**
	 * 一覧から選択している値をキー指定で取得する
	 * @param key キー
	 * @return 選択値
	 */
	@SuppressWarnings("unchecked")
	private String getSelectedData(String key)
	{
		X31SDataBeanAccessArray list = getServiceFormBean().getDataBeanArray(SEARCH_RSLT_LIST);
		if (list.getCount() == 0)
		{
			return null;
		}

		return getData(list.getDataBean(getDataL(this, I_CHOICE).intValue()), key);
	}
	
	
	/**
	 * ページング処理を行います。
	 * @return 処理実行結果
	 */
	public boolean paging() throws Exception
	{
		innerSearch(FUNC_CD_1, SEARCH_RSLT_LIST, true);
		return true;
	}

	/**
	 * クリア処理を行います。
	 * @return 処理実行結果
	 */
	public boolean clear() throws Exception
	{
		for (String pulldown : PULLDOWNS)
		{
			clearPullDown(this, pulldown, I_CD_INDEX_01, I_CD_CD_01, I_CD_NM_01, I_CD_CD_LIST_01, I_CD_NM_LIST_01);
		}
		
		setData(this, "", I_SVKEI_NO);
		setData(this, 0L, I_CHOICE);

		getServiceFormBean().getDataBeanArray(SEARCH_RSLT_LIST).clearArray();

		storeSearchCondition();
		
		setScreenMode(SEARCH_MODE);
		setNextScreen(SCREEN_ID_DKW02701, SCREEN_NAME_DKW02701);

		init();
		
		return true;
	}

	
	/**
	 * 一覧検索処理を実施します。
	 * @param functionCode 機能コード
	 * @param listName 取得データを格納する一覧のデータ名称
	 * @param withPager ページャを使用するかどうか
	 * @return エラーがあった場合:true ない場合:false
	 */
	@SuppressWarnings("unchecked")
	private boolean innerSearch(String functionCode, String listName, boolean withPager) throws Exception
	{
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		X31SDataBeanAccess[] paramBean = {bean};
		
		HashMap paramMap = new HashMap();
		HashMap inputMap = new HashMap();
		HashMap outputMap = new HashMap();

		bean.getDataBeanArray(listName).clearArray();
		setData(this, 0L, I_CHOICE);

		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, DKSV0110);
		
		DKSV0110_DKSV0110OPDBMapper mapper = new DKSV0110_DKSV0110OPDBMapper();
		mapper.setDKSV011001CC(paramBean, inputMap, functionCode);
		if (withPager)
		{
			JCCWebCommon.upmapperPageLinkInfo(this, "DKSV011001CC", inputMap);
		}

		 invokeService(paramMap, inputMap, outputMap);
		
		mapper.getDKSV011001CC(paramBean, outputMap, listName);
		if (withPager)
		{
			JCCWebCommon.downmapperPageLinkInfo(this, "DKSV011001CC", outputMap);
		}
		
		String searchErrFlg = JCCWebCommon.getSearchErrFlg("DKSV011001CC", outputMap);
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchErrFlg))
		{
			DEBUG_LOG.debug("検索結果0件");
			JCCWebCommon.setMessageInfo(this, "EKB0330--I");
			return false;
		}
		else if (JPCModelConstant.SEARCH_ERR_FLG_OVERMAX.equals(searchErrFlg))
		{
			DEBUG_LOG.debug(String.format("検索結果%s件以上", JCCWebCommon.getSearchConst("DKW02701_MAX_SHOW_CNT")));
			JCCWebCommon.setMessageInfo(this, "EKB0340--I", new String [] {JCCWebCommon.getSearchConst("DKW02701_MAX_SHOW_CNT")});
			return false;
		}
		else if (JPCModelConstant.SEARCH_ERR_FLG_NODATA.equals(searchErrFlg))
		{
			DEBUG_LOG.debug(String.format("データが見つからない %s", getData(this, SELECTED_KKTK_SVKEI_NO)));
			if (getCommonInfoBean().getDataBeanArray(CommonInfoCFConst.MESSAGES_LIST).getCount() == 0)
			{
				JCCWebCommon.setMessageInfo(this, "EKB0350--I");
			}
		}
		
		if (withPager)
		{
			JCCWebCommon.setSearchCommand(this, "L_PAG");
		}
		editList();
		
		return true;
	}

	/**
	 * 一覧データを編集します。
	 */
	private void editList() throws Exception
	{
		X31SDataBeanAccessArray list = getServiceFormBean().getDataBeanArray(SEARCH_RSLT_LIST);
		int size = list.getCount();
		for (int i = 0 ; i < size ; i++) 
		{
			X31SDataBeanAccess data = list.getDataBean(i);

			setData(data, (i + 1L), L_NO_02);
			setData(data, ((i + 1) % 2 == 0) ? "even" : "odd", L_COLOR_02);
			setData(data, (substr(getData(data, L_CUST_NM_02), 0, 5)), L_CUST_NM_DISP_02);
			setData(data, substr(getData(data, L_KEI_SVC_02), 0, 10), L_KEI_SVC_DISP_02);
			setData(data, (substr(getData(data, L_KEI_STAT_02), 0, 5)), L_KEI_STAT_DISP_02);
			setData(data, (substr(getData(data, L_TTM_NM_CHBF_02), 0, 10)), L_TTM_NM_CHBF_DISP_02);
			setData(data, (substr(getData(data, L_SHELF_NM_02), 0, 6)), L_SHELF_NM_DISP_02);
			setData(data, getModelNo(data), L_MDL_NO_02);
		}
	}

	/**
	 * 型番号を取得する
	 * @param data データBean
	 * @return 型番号
	 */
	private String getModelNo(X31SDataBeanAccess data)
	{
		String value = "";
		for (String key : MODEL_NO_LIST)
		{
			value = getData(data, key);
			if (value.length() > 0)
			{
				break;
			}
		}
		return value;
	}
	
	/**
	 * 前回検索時の検索条件を保存します。
	 */
	private void storeSearchCondition()
	{
		adjustInputs();

		setData(this, getData(this, I_TTM_NM_CHBF, I_CD_CD_01), SEARCH_TTM_NM_CHBF);
		setData(this, getData(this, I_MDL_NO, I_CD_CD_01), SEARCH_MDL_NO);
		setData(this, getData(this, I_SHELF_NM, I_CD_CD_01), SEARCH_SHELF_NM);
		setData(this, getData(this, I_SVKEI_NO), SEARCH_SVKEI_NO);

	}

	/**
	 * 前回検索時の検索条件を復元します。
	 */
	private void restoreSearchCondition()
	{
		setData(this, getData(this, SEARCH_SVKEI_NO), I_SVKEI_NO);

		initPulldownIndexByCode(I_TTM_NM_CHBF, getData(this, SEARCH_TTM_NM_CHBF));
		initPulldownIndexByCode(I_MDL_NO, getData(this, SEARCH_MDL_NO));
		initPulldownIndexByCode(I_SHELF_NM, getData(this, SEARCH_SHELF_NM));
	}

	/**
	 * プルダウンなどの選択項目から選択値を求める
	 */
	private void adjustInputs()
	{
		for (String pulldown : PULLDOWNS)
		{
			storePullDown(this, pulldown, I_CD_INDEX_01, I_CD_CD_01, I_CD_NM_01, I_CD_CD_LIST_01, I_CD_NM_LIST_01);
		}
		
	}

	/**
	 * セッションに格納した検索条件を復元します。
	 * @return 成否
	 */
	@SuppressWarnings("unchecked")
	private boolean restoreConditionFromSession()
	{
		HashMap map = JCCWebCommon.getScreenInfo(this);
		if (map == null)
		{
			return false;
		}

		for (String key : SEARCH_CONDITION_STRING_KEIES)
		{
			setData(this, (String)map.get(key), key);
		}
		
		return true;
	}

	/**
	 * プルダウンの０番目の項目に空白を挿入します。
	 * @param pulldown プルダウンを指す項目ID
	 * @param cdList プルダウン中でコード一覧をさす項目ID
	 * @param nmList プルダウン中で名称一覧をさす項目ID
	 * @param pushString 追加する文字列
	 */
	private void pushEmptyToTopOfPulldown(String pulldown, String cdList, String nmList, String pushString)
	{
		X31SDataBeanAccess pulldownBean = super.getServiceFormBean().getDataBeanArray(pulldown).getDataBean(0);

		appendPrefix(getBean(this, pulldown), nmList);
		
		slideArrayOnDatabean(pulldownBean, cdList, "");
		slideArrayOnDatabean(pulldownBean, nmList, pushString);
	}

	/**
	 * 検索条件からプルダウンの初期値を設定します。
	 */
	private void initPulldownIndexByCode(String pulldownLabel, String code)
	{
		if (JDKCommonUtil.isNull(code))
		{
			return;
		}
		
		X31SDataBeanAccess pulldown = getServiceFormBean().getDataBeanArray(pulldownLabel).getDataBean(0);
		int length = (Integer)pulldown.sendMessage(I_CD_CD_LIST_01, X31CWebConst.DATABEAN_GET_COUNT);
		for (int i = 0; i < length; i++)
		{
			String test = pulldown.sendMessageString(I_CD_CD_LIST_01, X31CWebConst.DATABEAN_GET_VALUE, i);
			if (test.equals(code))
			{
				setData(this, (long)i, pulldownLabel, I_CD_INDEX_01);
				return;
			}
		}
	}

	/**
	 * データビーンの配列要素をインデックスが増加する方向に１つずらす
	 * @param bean データビーン
	 * @param listName 対象項目ID
	 * @param pushString 追加する文字列
	 */
	private void slideArrayOnDatabean(X31SDataBeanAccess bean, String listName, String pushString)
	{
		int size = (Integer)(bean.sendMessage(listName, X31CWebConst.DATABEAN_GET_COUNT));
		
		bean.sendMessageString(listName, X31CWebConst.DATABEAN_ADD_VALUE, "");
		
		for (int i = size ; i > 0 ; i--)
		{
			String target = bean.sendMessageString(listName, X31CWebConst.DATABEAN_GET_VALUE, i - 1);
			bean.sendMessageString(listName, X31CWebConst.DATABEAN_SET_VALUE, i, target);
		}
		
		bean.sendMessageString(listName, X31CWebConst.DATABEAN_SET_VALUE, 0, pushString);
	}

	/**
	 * 画面遷移先を設定します。
	 * @author 富士通
	 * @param nextScreenId 遷移先画面ＩＤ
	 * @param nextScreenName 遷移先画面名
	 */
	private void setNextScreen(String nextScreenId, String nextScreenName)
	{
		X31SDataBeanAccess  commoninfoBean = super.getCommonInfoBean();
	
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		DEBUG_LOG.debug(String.format("遷移先 CD：%s NM：%s", nextScreenId, nextScreenName));
	}

	
	/**
	 * スクリーンモードを設定します。
	 * @param mode スクリーンモード
	 */
	private void setScreenMode(long mode)
	{
		X31SDataBeanAccess bean = super.getServiceFormBean();
		bean.sendMessageLong(SCREEN_MODE, X31CWebConst.DATABEAN_SET_VALUE, mode);
		
		DEBUG_LOG.debug(String.format("画面モードを %d に設定します", mode));
	}

}
