/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom  					 *
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatKKEoTelPackUtil
 *	ソースファイル名	：JBSbatKKEoTelPackUtil.java
 *	作成者				：富士通　
 *	作成日				：2014年05月21日
 *＜機能概要＞
 *　eo光電話オプションパック移行用ユーティリティ
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v9.00.00	2014/05/21   FJ)松本	新規作成(ANK-2056-00-00_光電話セレクトオプションパック)
  *********************************************************************/
package eo.business.common;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.business.util.table.JBSbatFU_M_RTWAJG_JKN;
import eo.business.util.table.JBSbatFU_M_RTWAJG_KSS_STV;

public class JBSbatKKEoTelPackUtil
{
	// ■DB関連定義
	/** テーブル(置換型割引適用判定構成サービス基準値) */
	private static final String D_TBL_NAME_FU_M_RTWAJG_KSS_STV = "FU_M_RTWAJG_KSS_STV";
	
	/** テーブル(置換型割引適用判定条件) */
	private static final String D_TBL_NAME_FU_M_RTWAJG_JKN = "FU_M_RTWAJG_JKN";
	
	/** テーブル(オプションサービス契約)*/
	private static final String D_TBL_NAME_KK_T_OP_SVC_KEI = "KK_T_OP_SVC_KEI";
	
	/** テーブル(サービス契約内訳)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_UCWK = "KK_T_SVC_KEI_UCWK";
	
	/** SQL定義キー(FU_M_RTWAJG_KSS_STV-KK_SELECT_001)*/
	private static final String FU_M_RTWAJG_KSS_STV_KK_SELECT_001 = "KK_SELECT_001";
	
	/** SQL定義キー(FU_M_RTWAJG_JKN-KK_SELECT_001)*/
	private static final String FU_M_RTWAJG_JKN_KK_SELECT_001 = "KK_SELECT_001";
	
	/** SQL定義キー(KK_T_OP_SVC_KEI-KK_SELECT_108)*/
	private static final String KK_T_OP_SVC_KEI_KK_SELECT_108 = "KK_SELECT_108";
	
	/** SQL定義キー(KK_T_OP_SVC_KEI-KK_SELECT_109)*/
	private static final String KK_T_OP_SVC_KEI_KK_SELECT_109 = "KK_SELECT_109";
	
	/** SQL定義キー(KK_T_SVC_KEI_UCWK-KK_SELECT_111)*/
	private static final String KK_T_SVC_KEI_UCWK_KK_SELECT_111 = "KK_SELECT_111";
	
	/** 置換型割引適用判定構成サービス基準値マスター対象レコード格納用マップ */
	private HashMap<String,String> fu0331Map = new HashMap<String,String>();
	
	/** 置換型割引適用判定条件マスター対象レコード格納用マップ */
	private HashMap<String,String> fu0341Map = new HashMap<String,String>();
	
	/**
	 * KK_T_OP_SVC_KEI_KK_SELECT_108,109 SELECT項目 契約番号（オプションサービス契約番号orサブオプションサービス契約番号）
	 */
	public static final String KK_T_OP_SVC_KEI_KK_SELECT_KEI_NO = "KEI_NO";
  
	/**
	 * KK_T_OP_SVC_KEI_KK_SELECT_108,109 SELECT項目 料金コースコード
	 * 	 */
    public static final String KK_T_OP_SVC_KEI_KK_SELECT_PCRS_CD = "PCRS_CD";
    
	/**
	 * KK_T_OP_SVC_KEI_KK_SELECT_108,109 SELECT項目 料金プランコード
	 */
    public static final String KK_T_OP_SVC_KEI_KK_SELECT_PPLAN_CD = "PPLAN_CD";
  
	/**
	 * KK_T_OP_SVC_KEI_KK_SELECT_108,109 SELECT項目 契約ステータス（オプションサービスステータスorサブオプションサービスステータス）
	 */
    public static final String KK_T_OP_SVC_KEI_KK_SELECT_KEI_STAT = "KEI_STAT";
	
	// ■その他
	/** フォーマット：先頭0埋め(16桁) */
	private static final String FILL_ZERO_16KETA = "%016d";
	
	/** コンストラクタから受け取った基準年月日格納用 */
	private String baseDate = null;
	
	/**
	 * コンストラクタ<br>
	 * @param cmnItem 共通電文
	 * @param baseDate 基準年月日
	 * @throws Exception 例外
	 * 
	 */
	public JBSbatKKEoTelPackUtil() throws Exception
	{
	}
	
	/**
	 * オプションパック適用判定初期処理です。
	 * <br>
	 * @param cmnItem 共通電文
	 * @param judgePcrsCdList 判定用料金コースコードリスト
	 * @return wribSvcCd 割引サービスコード
	 * @throws  Throwable
	 */
	
	public void judgeOptPackInit(JBSbatCommonItem cmnItem , String baseDate) throws Exception
	{
		//引数のnullチェック
		if(baseDate == null || baseDate.equals(""))
		{
			JBSbatBusinessError err = new JBSbatBusinessError("入力値エラーが発生しました。{基準年月日:" + baseDate + "}");
			//エラーログ出力
			cmnItem.getLogPrint().printBusinessErrorLog("EKKB0010CW",new String[]{String.valueOf(err)});
			cmnItem.setErrFlg(true);
			throw err;
		}
		//基準年月日をセット
		this.baseDate = baseDate;
		
		/****************************デバッグログ(引数出力）*********************************************************/
		
			cmnItem.getLogPrint().printDebugLog("\n\n■■■引数情報出力■■■\n基準年月日:" + baseDate + "\n");	
	
		/************************************************************************************************************/
		//置換型割引適用判定構成サービス基準値マスターアクセス用変数
		JBSbatSQLAccess fu0331SqlAc = null;
		//置換型割引適用判定条件マスターアクセス用
		JBSbatSQLAccess fu0341SqlAc = null;
		
		try
		{
			//置換型割引適用判定構成サービス基準値マスターにアクセス
			fu0331SqlAc = new JBSbatSQLAccess(cmnItem, D_TBL_NAME_FU_M_RTWAJG_KSS_STV);
			JBSbatCommonDBInterface fu0331DbList = new JBSbatCommonDBInterface();
			//SQLパラメータに基準日（運用日）を設定
			fu0331DbList.setValue(baseDate);
			fu0331DbList.setValue(baseDate);
			//SQL発行
			fu0331SqlAc.selectBySqlDefine(fu0331DbList,FU_M_RTWAJG_KSS_STV_KK_SELECT_001);
			
			//料金コースコード＋料金プランコードをKey
			//置換型割引適用判定構成サービス基準値をValueとするマップに対象レコードを格納させる
			JBSbatCommonDBInterface recMap = null;
			while((recMap = fu0331SqlAc.selectNext()) != null)
			{
				fu0331Map.put(recMap.getString(JBSbatFU_M_RTWAJG_KSS_STV.PCRS_CD)
						+recMap.getString(JBSbatFU_M_RTWAJG_KSS_STV.PPLAN_CD),
						recMap.getString(JBSbatFU_M_RTWAJG_KSS_STV.RTWAJG_KSS_STV));
			}
			
			//置換型割引適用判定条件マスターにアクセス
			fu0341SqlAc = new JBSbatSQLAccess(cmnItem, D_TBL_NAME_FU_M_RTWAJG_JKN);
			JBSbatCommonDBInterface fu0341DbList = new JBSbatCommonDBInterface();
			//SQLパラメータに基準日（運用日）を設定
			fu0341DbList.setValue(baseDate);
			fu0341DbList.setValue(baseDate);
			//SQL発行
			fu0341SqlAc.selectBySqlDefine(fu0341DbList,FU_M_RTWAJG_JKN_KK_SELECT_001);
			
			//置換型割引適用判定条件値をKey、割引サービスコードをValueとするマップに対象レコードを格納する
			while((recMap = fu0341SqlAc.selectNext()) != null)
			{
				fu0341Map.put(recMap.getString(JBSbatFU_M_RTWAJG_JKN.RTWAJG_JKN_VALUE),
									recMap.getString(JBSbatFU_M_RTWAJG_JKN.WRIB_SVC_CD));
			}
		}
		catch (SQLException e)
		{
			throw new Exception( "置換型割引適用判定構成サービス基準値マスター" +
					"および置換型割引適用判定条件マスター取得処理で例外が発生しました。");
		}
		finally
		{
			if (fu0331SqlAc != null && fu0341SqlAc != null)
			{
				fu0331SqlAc.close();
				fu0341SqlAc.close();
			}
		}
		/****************************デバッグログ（取得マスター値出力）***************************************/
		
		cmnItem.getLogPrint().printDebugLog("\n\n■■■置換型割引適用判定構成サービス基準値マスター値の取得■■■\n"
				+"件数："+fu0331Map.size()+"件\n"+fu0331Map+"\n\n■■■置換型割引適用判定条件マスター値の取得■■■\n"
				+"件数："+fu0341Map.size()+"件\n"+fu0341Map);
		/********************************************************************************************************/
	}
	
	/**
	 * オプションパック適用判定処理です。
	 * <br>
	 * @param cmnItem 共通電文
	 * @param judgePcrsCdList 判定用料金コースコードリスト
	 * @return wribSvcCd 割引サービスコード
	 * @throws  Throwable
	 */
	
	public String judgeOptPack(JBSbatCommonItem cmnItem,ArrayList<String[]> judgePcrsCdList) throws Exception
	{	

		// 戻り値の割引サービスコード格納用
		String wribSvcCd = null;
		
		// 置換型割引適用判定構成サービス基準値格納リスト
		ArrayList<String> rtwajgKssStvList = new ArrayList<String>();
		for(String[] pCd:judgePcrsCdList){
			//料金コースコード＋料金プランコードでKey生成
			String keyCd = pCd[0]+pCd[1];
			//Keyを元にValue（置換型割引適用判定構成サービス）を取得
			String retStr = fu0331Map.get(keyCd);
			if(retStr != null)
			{
				rtwajgKssStvList.add(retStr);
			}
		}
		
		if(rtwajgKssStvList.size()==0)
		{
			//エラーログ出力
			JBSbatBusinessError err = new JBSbatBusinessError("置換型割引適用判定構成サービス基準値取得エラー\n" +
					"【判定用料金コースコードリスト情報】\n"+ judgePcrsCdList);
			//エラーログ出力
			cmnItem.getLogPrint().printBusinessErrorLog("EKKB0010CW",new String[]{String.valueOf(err)});
			cmnItem.setErrFlg(true);
			throw err;
		}
		/****************************デバッグログ(引数出力）**********************************************/
		
		String str = "\n\n■■■引数情報(判定用料金コースコードリスト詳細)■■■\n";
		for(String[] cdList:judgePcrsCdList)
		{
			str=str.concat("{料金コースコード："+cdList[0]+" | 料金プランコード："+cdList[1]+"}\n");
		}
		cmnItem.getLogPrint().printDebugLog(str);	
		/************************************************************************************************************/
		
		//置換型割引適用判定条件値の受け取り
		String packJudgeBaseVal = getPackJudgeBaseVal(rtwajgKssStvList);

		// 割引サービスコード取得
		wribSvcCd = getOtokuPackWribSvcCd(packJudgeBaseVal);
		/****************************デバッグログ（出力値情報）**********************************************/
		
		cmnItem.getLogPrint().printDebugLog("\n\n■■■出力値情報■■■\n"
				+ "割引サービスコード："+wribSvcCd + "\n");
		
		/********************************************************************************************************/
		return wribSvcCd;
	}
	
	/**
	 * 置換型割引適用判定条件値の文字列生成リターン処理です。
	 * 
	 * <br>
	 * @param rtwajgKssStvList 置換型割引適用判定構成サービス基準値リスト
	 * @return result 置換型割引適用判定条件値
	 * @throws Exception 例外
	 */
	private String getPackJudgeBaseVal(ArrayList<String> rtwajgKssStvList) throws Exception
	{
		// 結果格納用変数
		String result = null;

		// 計算結果格納用変数(初期値は0)
		long judgeValSum = 0;

		for (String rtwajgKssStv: rtwajgKssStvList)
		{
			judgeValSum = judgeValSum + Long.parseLong(rtwajgKssStv);
		}
		// 16桁になるように先頭を0埋めする
		result = String.format(FILL_ZERO_16KETA, judgeValSum);
		return result;
	}

	/**
	 * 該当する割引サービスコードを取得して返します。<br>
	 * 存在しない場合はnullを返します。
	 * <br>
	 * @param packJudgeBaseVal 置換型割引適用判定条件値
	 * @return wribSvcCd 割引サービスコード
	 */
	private String getOtokuPackWribSvcCd(String packJudgeBaseVal)
	{
		//割引サービスコード格納用
		String wribSvcCd = null;
		//置換型割引適用判定条件マップから割引サービスコードを取得
		wribSvcCd = fu0341Map.get(packJudgeBaseVal);
		return wribSvcCd;
	}
	
	/**
	 * サービス開始済のオプションサービス契約／サブオプションサービス契約カレント取得<br>
	 * 
	 * @param svcKeiUcwkNo  サービス契約内訳番号
	 * @param baseDate  基準日
	 * @return オプションサービス契約／サブオプションサービス契約のカレント取得結果
	 * @throws Exception 例外が発生した場合
	 */
	public ArrayList<HashMap<String, Object>> selectOpSvcKeiStaBySvcKeiUcwk(JBSbatCommonItem cmnItem, String svcKeiUcwkNo, String baseDate) throws Exception
	{
		
		JBSbatSQLAccess stmt = null;
		
		// 戻り値
		ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();
		
		try
		{
			
			stmt = new JBSbatSQLAccess(cmnItem, D_TBL_NAME_KK_T_OP_SVC_KEI);
			
			// 検索キーを設定する
			JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
			dbList.setValue(svcKeiUcwkNo);					// サービス契約番号
			dbList.setValue(baseDate);						// 基準日
			dbList.setValue(baseDate);						// 基準日
			dbList.setValue(svcKeiUcwkNo);					// サービス契約番号
			dbList.setValue(baseDate);						// 基準日
			dbList.setValue(baseDate);						// 基準日
			dbList.setValue(baseDate);						// 基準日
			
			stmt.selectBySqlDefine(dbList, KK_T_OP_SVC_KEI_KK_SELECT_108);
			
			JBSbatCommonDBInterface inMap = new JBSbatCommonDBInterface(); 
			while (null != (inMap = stmt.selectNext()))
			{
				resultList.add((HashMap<String, Object>)inMap.getMap());
			}
			
		}
		catch (SQLException e)
		{
			throw new Exception( "オプションサービス契約／サブオプションサービス契約のカレント取得処理で例外が発生しました。");
		}
		finally
		{
			if (stmt != null)
			{
				stmt.close();
			}
	
		}
		return resultList;
	}
	
	/**
	 * 解約・キャンセル以外のオプションサービス契約／サブオプションサービス契約カレント取得<br>
	 * 
	 * @param svcKeiUcwkNo  サービス契約内訳番号
	 * @param baseDate  基準日
	 * @return オプションサービス契約／サブオプションサービス契約のカレント取得結果
	 * @throws Exception 例外が発生した場合
	 */
	public ArrayList<HashMap<String, Object>> selectOpSvcKeiBySvcKeiUcwk(JBSbatCommonItem cmnItem, String svcKeiUcwkNo, String baseDate) throws Exception
	{
		
		JBSbatSQLAccess stmt = null;
		
		// 戻り値
		ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();
		
		try
		{
			
			stmt = new JBSbatSQLAccess(cmnItem, D_TBL_NAME_KK_T_OP_SVC_KEI);
			
			// 検索キーを設定する
			JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
			dbList.setValue(svcKeiUcwkNo);					// サービス契約番号
			dbList.setValue(baseDate);						// 基準日
			dbList.setValue(svcKeiUcwkNo);					// サービス契約番号
			dbList.setValue(baseDate);						// 基準日
			dbList.setValue(baseDate);						// 基準日
			
			stmt.selectBySqlDefine(dbList, KK_T_OP_SVC_KEI_KK_SELECT_109);
			
			JBSbatCommonDBInterface inMap = new JBSbatCommonDBInterface(); 
			while (null != (inMap = stmt.selectNext()))
			{
				resultList.add((HashMap<String, Object>)inMap.getMap());
			}
			
		}
		catch (SQLException e)
		{
			throw new Exception( "オプションサービス契約／サブオプションサービス契約のカレント取得処理で例外が発生しました。");
		}
		finally
		{
			if (stmt != null)
			{
				stmt.close();
			}
	
		}
		return resultList;
	}
	
	/**
	 * サービス契約内訳カレント取得<br>
	 * 
	 * @param svcKeiUcwkNo  サービス契約内訳番号
	 * @param baseDate  基準日
	 * @return 
	 * @throws Exception 例外が発生した場合
	 */
	public HashMap<String, Object> selectSvcKeiUcwk(JBSbatCommonItem cmnItem, String svcKeiUcwkNo, String baseDate) throws Exception
	{
		
		JBSbatSQLAccess stmt = null;
		
		// 戻り値
		HashMap<String, Object> result = new HashMap<String, Object>();
		
		try
		{
			
			stmt = new JBSbatSQLAccess(cmnItem, D_TBL_NAME_KK_T_SVC_KEI_UCWK);
			
			// 検索キーを設定する
			JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
			dbList.setValue(svcKeiUcwkNo);					// サービス契約番号
			dbList.setValue(baseDate);						// 基準日
			
			stmt.selectBySqlDefine(dbList, KK_T_SVC_KEI_UCWK_KK_SELECT_111);
			
			JBSbatCommonDBInterface inMap = new JBSbatCommonDBInterface(); 
			
			inMap = stmt.selectNext();
			if (inMap != null)
			{
				result = (HashMap<String, Object>)inMap.getMap();
			}
		}
		catch (SQLException e)
		{
			throw new Exception( "サービス契約内訳カレント取得処理で例外が発生しました。");
		}
		finally
		{
			if (stmt != null)
			{
				stmt.close();
			}
	
		}
		return result;
	}
	
	/**
	 * オプションサービス契約／サブオプションサービス契約のカレント一覧から<br>
	 * 引数の料金プランコードに一致する契約番号（オプションサービス契約番号orサブオプションサービス契約番号）<br>
	 * を取得します。<br>
	 * @param opSvcKeiList  selectOpSvcKeiBySvcKeiUcwkの結果
	 * @param pcrsCd  料金プランコード
	 * @return カレントレコードのJBSbatCommonDBInterfaceオブジェクト
	 * @throws Exception 例外が発生した場合
	 */
	public String getKeiNo(ArrayList<HashMap<String, Object>> opSvcKeiList, String pcrsCd) throws Exception
	{
		
		String result = null;
		
		if (opSvcKeiList != null && opSvcKeiList.size() > 0)
		{
			for (HashMap<String, Object> opSvcKei : opSvcKeiList)
			{
				
				if (pcrsCd.equals((String)opSvcKei.get(KK_T_OP_SVC_KEI_KK_SELECT_PCRS_CD)))
				{
					result = (String)opSvcKei.get(KK_T_OP_SVC_KEI_KK_SELECT_KEI_NO);
				}
			}
		}
		
		return result;
	}
	
	/**
	 * 割引サービスコードを日本語に変換します
	 * 
	 * @param pcrsCd  料金プランコード
	 * @return カレントレコードのJBSbatCommonDBInterfaceオブジェクト
	 * @throws Exception 例外が発生した場合
	 */
	public String convPackSti(String wribSvcCd) throws Exception
	{
		
		String result = null;
		
		if ("W00000007".equals(wribSvcCd))
		{
			result = "パック３";
		}
		else if ("W00000008".equals(wribSvcCd))
		{
			result = "パック７";
		}
		else
		{
			result = wribSvcCd;
		}
		
		return result;
	}

}
