/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKElecUsePlaceShkHsAdd
*	ソースファイル名	：JBSbatKKElecUsePlaceShkHsAdd.java
*	作成者				：富士通　
*	作成日				：2016年10月17日
*＜機能概要＞
*　ｅｏ電気利用場所商品券発送追加部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v27.00.00	2016/10/17   FJ）清原	【ANK-3005-00-00】  eo電気の商品券CPコード追加（STEP2）
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFE165;
import eo.business.util.file.JBSbatKKIFM198;
import eo.business.util.file.JBSbatKKIFM724;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JKKCommonUtil;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKElecUsePlaceShkHsAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	// ***** ユースケースID・オペレーションID *****
	/** eo電気利用場所照会CC ユースケースID */
	private static final String USECASE_ID = "KKSV0850";
	
	/** eo電気利用場所照会CC オペレーションID */
	private static final String OPERATION_ID = "KKSV0850OP";
	
	/** eo電気利用場所照会CCマップ リクエストキー */
	private static final String KKSV085001CC = "KKSV085001CC";
	
	/** ファイル出力フラグ・出力する */
	private static final String OUTPUT_FLG_TRUE = "1" ;

	/** ファイル出力フラグ・出力しない */
	private static final String OUTPUT_FLG_FALSE = "0";

	/** 入力ファイルリスト */
	ArrayList<Object> inputFileList = new ArrayList<Object>();
	
	/** フリー項目 */
	private String[] freeItems = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		//FREEITEMから取得
		this.freeItems = super.freeItem.split(";");
		
		//読み込むファイルの名前
		String inputDefFileName = (freeItems[0]);
		String inputFileName = (freeItems[1]);

		//ファイル読込処理
		setElecSohinkList(inputFileName, inputDefFileName);
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public JBSbatOutputItem execute() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		//-------------------------------
		// CC呼出前処理
		//-------------------------------

		//eo電気利用場所住所取得CC入力情報
		HashMap<String, Object> excuteMap = new HashMap<String, Object>();
		
		//eo電気利用場所住所取得CC出力情報
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		//CC入力リストを設定
		ArrayList<HashMap<String, String>> inputList = setCCInParam();
		
		//eo電気契約一意照会リスト
		excuteMap.put(JKKStrConst.KKSV0850_KKSV085001CC_LIST, inputList);
		
		//-------------------------------
		// CC呼出
		//-------------------------------
		
		//eo電気利用場所住所取得CC呼出
		outputMap = doExecute(excuteMap);
		
		//-------------------------------
		// CC呼出後処理
		//-------------------------------
		
		//eo電気利用場所住所取得CCエラー判定処理
		executeCcReturnCodeJdg(outputMap);
		
		//出力リストからCCマップを取得
		HashMap<String, Object> outPutCcMap = (HashMap<String, Object>)outputMap.get(JKKStrConst.KKSV0850_KKSV085001CC);
		
		//CCマップからCCリストを取得して格納
		ArrayList<HashMap<String, String>> outPutCCList = (ArrayList<HashMap<String, String>>)outPutCcMap.get(JKKStrConst.KKSV0850_KKSV085001CC_LIST);
		
		//CC出力結果をマップに設定
		HashMap<String, HashMap<String, String>> ccRsltMap = setCcOuMap(outPutCCList);
		
		//-------------------------------
		// 出力処理
		//-------------------------------
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		//ファイル出力処理
		outPutElecShkHsFile(outputBean, ccRsltMap);
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	

	/**
	 * eo電気利用場所住所取得CCパラメータ設定処理
	 * 
	 * @return inputList
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, String>> setCCInParam() throws Exception
	{
		ArrayList<HashMap<String, String>> inputList = new ArrayList<HashMap<String, String>>();
		
		HashMap<String, String> paramMap = new HashMap<String, String>();
		
		//CCパラメータセット処理
		for (int i = 0; i < inputFileList.size(); i++)
		{
			//入力ファイルのマップを取得
			HashMap<String, String> inputFileRowMap = (HashMap<String, String>)inputFileList.get(i);
			
			//格納用のマップを作成
			paramMap = new HashMap<String, String>();
			
			//格納用のマップにサービス契約番号を設定
			paramMap.put(JKKStrConst.KKSV0850_KEY_SVC_KEI_NO, inputFileRowMap.get(JBSbatKKIFM724.SVC_KEI_NO));
			
			//入力リストに追加
			inputList.add(paramMap);
		}
		return inputList;
	}
	
	/**
	 * eo電気利用場所住所取得CCエラー判定処理
	 * @param outputMap 
	 * 
	 * @param inMap 入力電文
	 * @throws Exception
	 */
	private void executeCcReturnCodeJdg(HashMap<String, Object> outputMap) throws Exception
	{
		
		// サービスの処理結果を判定
		String returnCode = outputMap.get(JCCBatchEsbInterface.RETURN_CODE).toString();
		
		//リターンコードが正常または警告以外であればエラーを発生
		if(!JCCBatchEsbInterface.RETURN_CODE_SUCCESS.equals(returnCode) && !JCCBatchEsbInterface.RETURN_CODE_WARNING.equals(returnCode))
		{
			super.logPrint.printDebugLog("returnCode:" + returnCode);
			// エラーログ出力
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB0010CW, 
					new String[] { "KKSV0850 エラーレベル：" + 
					outputMap.get(JCCBatchEsbInterface.RETURN_CODE).toString() });
			// エラーフラグ設定
			super.commonItem.setErrFlg(true);
			throw new JBSbatBusinessError();
		}
	}

	/**
	 * eo電気利用場所住所取得CC呼び出し処理
	 * 
	 * @param excuteMap 入力電文
	 * @return outputMap 処理結果
	 * @throws Exception
	 */
	private HashMap<String, Object> doExecute(HashMap<String, Object> excuteMap) throws Exception
	{
		
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		// eo電気利用場所住所取得CC呼び出し
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, USECASE_ID);
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_OPERATION_ID, OPERATION_ID);
		// サービスに渡す業務データを格納するMAPです。
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		
		// inputMapにCCに必要な情報をセットする
		inputMap.put(KKSV085001CC, excuteMap);
		
		// サービスの処理結果が格納されるMAPを生成
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		// eo電気利用場所住所取得CCを呼び出す
		JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);

		// 処理結果を返却する
		return outputMap;
	}
	
	/**
	 * 
	 * eo電気利用場所発送用商品券情報ファイル読込
	 * 
	 * @param  path ファイルパス
	 * @param  defPath ファイル項目定義パス
	 */
	private void setElecSohinkList(String path, String defPath) throws Exception 
	{
		
		JBSbatServiceInterfaceMap rowMap = null;
		

		//ファイル読込処理
		JBSbatInputFileUtil readObj      = new JBSbatInputFileUtil(path);
		JBSbatDefFileUtil   fileDef      = new JBSbatDefFileUtil(JBSbatAplConst.getAplConstValue("IND") + defPath, readObj);
		try
		{
			readObj.createReader();
			
			String line = "";
			while (readObj.ready()) 
			{
				
				line = readObj.readLine();
				rowMap = fileDef.lineToObject(line, readObj, 0);
				
				// 入力ファイルリストに追加
				this.inputFileList.add((retElecSohinkMap(rowMap)));
				
			}
		}
		finally
		{
			// 閉じる
			if (readObj != null)
			{
				readObj.close();
			}
			// 初期化
			readObj = null;
		}
	}
	

	/**
	 * 
	 * eo電気利用場所発送用商品券情報ファイルを名称付きで返却（既存名称と合わせて返却する.）
	 * 
	 * @param  adRowMap
	 * @return ret
	 * @throws Exception
	 */
	private HashMap<String, String> retElecSohinkMap(JBSbatServiceInterfaceMap adRowMap) throws Exception 
	{
		
		HashMap<String, String> ret = new HashMap<String, String>();
		
		ret.put(JBSbatKKIFM724.SVC_KEI_NO,    adRowMap.getString(JBSbatKKIFM724.SVC_KEI_NO));
		ret.put(JBSbatKKIFM724.MSKM_YMD,      adRowMap.getString(JBSbatKKIFM724.MSKM_YMD));
		ret.put(JBSbatKKIFM724.KIT_YMD,       adRowMap.getString(JBSbatKKIFM724.KIT_YMD));
		ret.put(JBSbatKKIFM724.CAMPAIGN_CD,   adRowMap.getString(JBSbatKKIFM724.CAMPAIGN_CD));
		ret.put(JBSbatKKIFM724.POST_CD,       adRowMap.getString(JBSbatKKIFM724.POST_CD));
		ret.put(JBSbatKKIFM724.SOHUS_NAME,    adRowMap.getString(JBSbatKKIFM724.SOHUS_NAME));
		ret.put(JBSbatKKIFM724.SOHUS_AD,      adRowMap.getString(JBSbatKKIFM724.SOHUS_AD));
		ret.put(JBSbatKKIFM724.SOHUS_TEL,     adRowMap.getString(JBSbatKKIFM724.SOHUS_TEL));
		ret.put(JBSbatKKIFM724.SHNK_KNGK,     adRowMap.getString(JBSbatKKIFM724.SHNK_KNGK));
		ret.put(JBSbatKKIFM724.AISTJ_SKBT_CD, adRowMap.getString(JBSbatKKIFM724.AISTJ_SKBT_CD));
		ret.put(JBSbatKKIFM724.APLY_CNT,      adRowMap.getString(JBSbatKKIFM724.APLY_CNT));
		ret.put(JBSbatKKIFM724.CHSHT_CNT,     adRowMap.getString(JBSbatKKIFM724.CHSHT_CNT));
		ret.put(JBSbatKKIFM724.DCHSKMST_NO,   adRowMap.getString(JBSbatKKIFM724.DCHSKMST_NO));
		ret.put(JBSbatKKIFM724.GENE_ADD_DTM,  adRowMap.getString(JBSbatKKIFM724.GENE_ADD_DTM));
		ret.put(JBSbatKKIFM724.UPD_DTM,       adRowMap.getString(JBSbatKKIFM724.UPD_DTM));
		
		return ret;
	}

	/**
	 * eo電気利用場所住所取得CC取得結果マップ設定
	 * @param ccRsltMap 
	 * @param outputMapCcList 
	 * @param inMap 入力電文
	 * @return 
	 * @return HashMap<String, Object> 処理結果
	 * @throws Exception
	 */
	private HashMap<String, HashMap<String, String>> setCcOuMap(ArrayList<HashMap<String, String>> outputMapCcList) throws Exception
	{

		HashMap<String, HashMap<String, String>> ccRsltMap = new HashMap<String, HashMap<String, String>>();
		
		HashMap<String, String> ccOutPutListRowMap = new HashMap<String, String>();
		HashMap<String, String> elecRyobshMap = new HashMap<String, String>();
		
		for (int i = 0; i < outputMapCcList.size(); i++)
		{
			elecRyobshMap = new HashMap<String, String>();
			
			ccOutPutListRowMap = outputMapCcList.get(i);
			elecRyobshMap.put(JKKStrConst.KKSV0850_RYOBSH_PCD, ccOutPutListRowMap.get(JKKStrConst.KKSV0850_RYOBSH_PCD));
			elecRyobshMap.put(JKKStrConst.KKSV0850_RYOBSH_AD, ccOutPutListRowMap.get(JKKStrConst.KKSV0850_RYOBSH_AD));
			
			ccRsltMap.put(ccOutPutListRowMap.get(JKKStrConst.KKSV0850_KEY_SVC_KEI_NO), elecRyobshMap);
			
		}
		return ccRsltMap;
	}
	
	/**
	 * ファイル出力処理
	 * @param outputBean 出力電文
	 * @param ccRsltMap 
	 * @param outputMapCcList 
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void outPutElecShkHsFile(JBSbatOutputItem outputBean, HashMap<String, HashMap<String, String>> ccRsltMap) throws Exception
	{

		//サービス契約番号
		String svcKeiNo = "";

		//利用場所郵便番号
		String ryobshPcd = "";
		
		//利用場所住所
		String ryobshAd = "";
		
		//ｅｏ電気利用場所マップ
		HashMap<String, String> eoElecRyobshMap = new HashMap<String, String>();
		
		//判定用マップにレコードを格納
		HashMap<String, String> inputFileRowMap = new HashMap<String, String>();
		
		//出力処理
		for (int i = 0; inputFileList.size() > i; i++)
		{
			//判定用マップにレコードを格納
			inputFileRowMap = (HashMap<String, String>)inputFileList.get(i);
			
			String outFlg = OUTPUT_FLG_FALSE;
			
			//サービス契約番号を取得
			svcKeiNo = inputFileRowMap.get(JBSbatKKIFE165.SVC_KEI_NO);
			
			//サービス契約番号を元にリストを取得
			eoElecRyobshMap = ccRsltMap.get(svcKeiNo);
			
			ryobshPcd = eoElecRyobshMap.get(JKKStrConst.KKSV0850_RYOBSH_PCD);
			ryobshAd = eoElecRyobshMap.get(JKKStrConst.KKSV0850_RYOBSH_AD);
			
			//利用場所郵便番号及び利用場所住所が取得できた場合に出力を行う
			if(!JKKCommonUtil.isNull(ryobshPcd) && !JKKCommonUtil.isNull(ryobshAd))
			{
				//出力フラグ：出力する。
				outFlg = OUTPUT_FLG_TRUE;
			}
			
			//出力フラグが"1"(出力する)の場合にファイル出力を行う。
			if(OUTPUT_FLG_TRUE.equals(outFlg))
			{
				//ファイル出力用インスタンスの作成（商品券発送指図ファイル）
				JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();	
				
				//商品券発送指図ファイルを編集
				outmap.setString(JBSbatKKIFE165.SVC_KEI_NO,           inputFileRowMap.get(JBSbatKKIFM724.SVC_KEI_NO));
				outmap.setString(JBSbatKKIFE165.MSKM_YMD,             inputFileRowMap.get(JBSbatKKIFM724.MSKM_YMD));
				outmap.setString(JBSbatKKIFE165.KIT_YMD,              inputFileRowMap.get(JBSbatKKIFM724.KIT_YMD));
				outmap.setString(JBSbatKKIFE165.CAMPAIGN_CD,          inputFileRowMap.get(JBSbatKKIFM724.CAMPAIGN_CD));
				outmap.setString(JBSbatKKIFE165.POST_CD,              ryobshPcd); //CCから取得した利用場所郵便番号
				outmap.setString(JBSbatKKIFE165.SOHUS_NAME,           inputFileRowMap.get(JBSbatKKIFM724.SOHUS_NAME));
				outmap.setString(JBSbatKKIFE165.SOHUS_AD,             ryobshAd);  //CCから取得した利用場所住所
				outmap.setString(JBSbatKKIFE165.SOHUS_TEL,            inputFileRowMap.get(JBSbatKKIFM724.SOHUS_TEL));
				outmap.setString(JBSbatKKIFE165.SHNK_KNGK,            inputFileRowMap.get(JBSbatKKIFM724.SHNK_KNGK));
				outmap.setString(JBSbatKKIFE165.AISTJ_SKBT_CD,        inputFileRowMap.get(JBSbatKKIFM724.AISTJ_SKBT_CD));
				
				outmap.setOutFlg(true);
				outputBean.addOutMapList(outmap);
				
				//ファイル出力用インスタンスの作成（データ抽出項目設定更新対象ファイル）
				JBSbatServiceInterfaceMap outmap2 = new JBSbatServiceInterfaceMap();
				
				//データ抽出項目設定更新対象ファイルを設定
				outmap2.setString(JBSbatKKIFM198.KK1351_APLY_CNT,     inputFileRowMap.get(JBSbatKKIFM724.APLY_CNT));
				outmap2.setString(JBSbatKKIFM198.KK1391_CHSHT_CNT,    inputFileRowMap.get(JBSbatKKIFM724.CHSHT_CNT));
				outmap2.setString(JBSbatKKIFM198.KK1391_DCHSKMST_NO,  inputFileRowMap.get(JBSbatKKIFM724.DCHSKMST_NO));
				outmap2.setString(JBSbatKKIFM198.KK1391_GENE_ADD_DTM, inputFileRowMap.get(JBSbatKKIFM724.GENE_ADD_DTM));
				outmap2.setString(JBSbatKKIFM198.KK1391_UPD_DTM,      inputFileRowMap.get(JBSbatKKIFM724.UPD_DTM));
				
				outmap2.setOutFlg(true);
				outputBean.addOutMapList_2(outmap2);
			}
			else
			{
				//利用場所郵便番号又は利用場所住所が取得できなかった場合
				if (JKKCommonUtil.isNull(ryobshPcd)
						|| JKKCommonUtil.isNull(ryobshAd))
				{
					outErrorMsg(svcKeiNo, ryobshPcd, ryobshAd);
				}
				
			}
		}
		return;
	}
	
	
	
	/**
	 * 出力処理エラーログ出力
	 * @param svcKeiNo サービス契約番号
	 * @param ryobshPcd 利用場所郵便番号
	 * @param ryobshAd 利用場所住所
	 * @throws Exception
	 */
	private void outErrorMsg(String svcKeiNo, String ryobshPcd, String ryobshAd) throws Exception
	{
		
		String p_ryobshPcd = ryobshPcd;
		String p_ryobshAd = ryobshAd;
		
		if(JKKCommonUtil.isNull(ryobshPcd))
		{
			p_ryobshPcd = " ";
		}
			
		if(JKKCommonUtil.isNull(ryobshAd))
		{
			p_ryobshAd = " ";
		}
		
		StringBuilder sb = new StringBuilder();
		sb.append("利用場所郵便番号又は利用場所住所");
		sb.append("（サービス契約番号：" + svcKeiNo + "," + "利用場所郵便番号：" + p_ryobshPcd + "," + "利用場所住所：" + p_ryobshAd + "）");

		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0290AW, new String[]{sb.toString()});

	}

	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
