/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JCRDataEditUtil
 *   ソースファイル名：JCRDataEditUtil.java
 *   作成者          ：富士通
 *   日付            ：2011年07月14日
 *＜機能概要＞
 *   サービス層編集部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/07/14   富士通      新規作成
 *   v6.00.00    2013/10/03   FJ)日野   【OM-2013-0002825】
 *	 v59.00.00	 2022/04/12	  FJ)北川	【ANK-3745-00-00】宛名印字ラベル、解約レター送付先住所の建物名部屋番号分割対応
 **********************************************************************/

package com.fujitsu.futurity.bp.custom.common;


import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JCRStrConst;
import eo.common.util.JCRUtilCommon;
import eo.common.util.JPCCommonUtil;



/**
 * サービス層編集部品です。<p>
 * <BR>
 * @author 富士通
 */
public class JCRDataEditUtil extends JPCCommonUtil 
{

	/**
	 * <p>
	 * 新しいサービス層編集部品を生成します。
	 * </p>
	 */
	public JCRDataEditUtil()
	{
	}

	
	/**
	 * <p>
	 * サービスIFの明細から値を取得し、String型で返却します
	 * </p>
	 * @param parentTemplate 取得対象のサービスインターフェイス
	 * @param listName 取得対象のリスト名
	 * @param itemName 取得対象の項目名
	 * @return 変換後の文字列
	 */
	public String editArrayToString(CAANMsg parentTemplate, String listName, String itemName)
	{
		StringBuffer str_Buff = new StringBuffer();
		CAANMsg[] templateArray = null;
		templateArray = parentTemplate.getCAANMsgList(listName);

		for (int i = 0; i < templateArray.length; i++) 
		{
			String value = (String)getSCListValueObject(parentTemplate, listName, i, itemName);
			
			// 配列を、カンマ区切りの文字列に変換する。
			if (value != null)
			{
				if (i > 0)
				{
					str_Buff.append(",");
				}
				str_Buff.append("'")
						.append(value)
						.append("'");
			}
			else 
			{
				return  str_Buff.toString();
			}
		}

		return  str_Buff.toString();
	}

	/**
	 * <p>
	 * サービスIFの明細項目から値を取得し、カンマ区切り文字列に変換します（取得数制限あり）
	 * </p>
	 * @param parentTemplate 取得対象のサービスインターフェイス
	 * @param listName 取得対象のリスト名
	 * @param itemName 取得対象の項目名
	 * @param chkVal 必須で取得する値
	 * @param iCnt 値の取得数
	 * @return 変換後の文字列
	 */
	public String editArrayToString(CAANMsg parentTemplate, String listName, String itemName, String chkVal, int iCnt)
	{
		StringBuffer str_Buff = new StringBuffer();
		Boolean isChkVal = false;
		
		if(iCnt <= 0)
		{
			CAANMsg[] templateArray = null;
			templateArray = parentTemplate.getCAANMsgList(listName);
			iCnt = templateArray.length;
		}
		
		for (int i = 0; i < iCnt; i++)
		{
			String value = (String)getSCListValueObject(parentTemplate, listName, i, itemName);
			
			// 配列を、カンマ区切りの文字列に変換する。
			if (value != null)
			{
				if (i > 0)
				{
					str_Buff.append(",");
				}
				
				// 必須取得情報が無ければスキップ
				if(chkVal != null && !"".equals(chkVal))
				{
					
					// 取得数-1までに必須取得情報がセットされていない場合、
					// 最後に必須取得情報をセットしてループを抜ける
					if(i >= iCnt - 1)
					{
						if(!isChkVal)
						{
							str_Buff.append("'")
									.append(chkVal)
									.append("'");
							break;
						}
					}
					
					// 取得データが必須取得情報と一致した場合、フラグをtrueにする。
					if(value.equals(chkVal))
					{
						isChkVal = true;
					}
				}
				
				str_Buff.append("'")
						.append(value)
						.append("'");
			}
			else
			{
				return  str_Buff.toString();
			}
		}
		return  str_Buff.toString();
	}
	
	/**
	 * <p>
	 * サービスIFの明細から値を取得します
	 * </p>
	 * @param parentTemplate 取得対象のサービスインターフェイス
	 * @param listName 取得対象のリスト名
	 * @param index 取得対象の明細番号
	 * @param itemName 取得対象の項目名
	 * @return 取得された値
	 */
	private Object getSCListValueObject(CAANMsg parentTemplate, String listName, Integer index, String itemName)
	{
		CAANMsg[] templateArray = null;
		templateArray = parentTemplate.getCAANMsgList(listName);
		CAANMsg childTemplate = templateArray[index];

		return 	childTemplate.getObject(itemName);
	}

	/**
	 * 資料送付グループ番号を返却します
	 * 
	 * @param param リクエストパラメータ
	 * @param hashNm ハッシュテーブル名
	 * @param listNm リスト名
	 * @param itemName 取得アイテム名
	 * @param retItemName 返却項目名
	 * @param hashNm2 ハッシュテーブル名
	 * @param searchItem 比較対象項目名
	 * @return 資料送付グループ番号
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public static String getListData(IRequestParameterReadOnly param, String hashNm ,
			String listNm, String itemName, String retItemName, String hashNm2, String searchItem) throws RequestParameterException 
	{
		
		Map<Object, Object> inMap = (Map<Object, Object>)param.getData(hashNm);
		List<Map<String, Object>> inList = (List<Map<String, Object>>)inMap.get(listNm);
		
		Map<Object, Object>	inMap2 = (Map<Object, Object>)param.getData(hashNm2);
		String searchKey = (String)inMap2.get(searchItem);
				
		String retGrpNo = null;
		if (inList == null)
		{
			return null;
		}

		for (int i = 0; i < inList.size(); i++)
		{
			Map<String, Object> childMap = inList.get(i);
			if (i == 0)
			{
				retGrpNo = (String)childMap.get(retItemName);
			}
			String wkCd = (String)childMap.get(itemName);
			if (!JCRUtilCommon.isNull(wkCd))
			{
				if (wkCd.equals(searchKey))
				{
					return (String)childMap.get(retItemName);
				}
			}
		}
		return retGrpNo;
	}

	/**
	 * リストに出力するデータを作成します
	 * 
	 * @param param リクエストパラメータ
	 * @param scNm  サービスコンポーネント名
	 * @param listNm リスト名
	 * @param scNm2 サービスコンポーネント名
	 * @param keyItem 取得項目名
	 * @param address1 住所項目名１
	 * @param address2 住所項目名２
	 * @param address3 住所項目名３
	 * @param barCode バーコード項目名
	 * @param keyItem2 取得項目名
	 * @return リスト出力用データ
	 * @throws RequestParameterException
	 * @throws UnsupportedEncodingException 
	 */
	@SuppressWarnings("unchecked")
	public static byte[] makeListData(IRequestParameterReadOnly param,
			String scNm, String listNm, String scNm2, String[] keyItem, 
			String[] address1, String[] address2,  String[] address3, String[] barCode, String[] keyItem2) throws RequestParameterException, UnsupportedEncodingException 
	{

		StringBuilder commonItem = new StringBuilder();

		Map<Object, Object> inMap2 = (Map<Object, Object>)param.getData(scNm2);

		// |処理日|保存期間|ユーザーＩＤ|ユーザー名|出力端末|検索日
		commonItem.append(JCRStrConst.TAB_CD);
		commonItem.append(JCRUtilCommon.formatDate(JCCBPCommon.getSysDateTime(), JCRStrConst.FMT_YMDHMS ,JCRStrConst.FMT_EDIT_YMD));
		commonItem.append(JCRStrConst.TAB_CD);
		commonItem.append((String)inMap2.get("user_id"));
		commonItem.append(JCRStrConst.TAB_CD);
		commonItem.append((String)inMap2.get("user_nm"));
		commonItem.append(JCRStrConst.TAB_CD);
		commonItem.append((String)inMap2.get("ip_address"));
		commonItem.append(JCRStrConst.TAB_CD);
		commonItem.append(JCRUtilCommon.formatDate(JCCBPCommon.getSysDateTime(), JCRStrConst.FMT_YMDHMS ,JCRStrConst.FMT_EDIT_YMDHM));

		StringBuilder retItem = new StringBuilder();

		Map<Object, Object> inMap = (Map<Object, Object>)param.getData(scNm);
		List<HashMap<String, Object>> inList = (List<HashMap<String, Object>>)inMap.get(listNm);

		for(int i = 0; i < inList.size(); i++)
		{
			Map<String, Object> childMap = inList.get(i);
			
			// 番号|
			retItem.append(i + 1);
			retItem.append(JCRStrConst.TAB_CD);
			// 登録日時|部署名|担当者|対応記録番号|資料分類名|資料名|部数|郵便番号
			for(int count = 0; count < keyItem.length; count++)
			{
				if (count == 0)
				{
					retItem.append(JCRUtilCommon.formatDate((String)childMap.get(keyItem[count]),JCRStrConst.FMT_YMD ,JCRStrConst.FMT_EDIT_YMD));
				}
				else
				{
					retItem.append((String)childMap.get(keyItem[count]));
				}
				retItem.append(JCRStrConst.TAB_CD);
			}
			// 送付先住所|
			for(int count = 0; count < address1.length; count++)
			{
				retItem.append((String)childMap.get(address1[count]));
			}
			retItem.append(JCRStrConst.TAB_CD);
			for(int count = 0; count < address2.length; count++)
			{
				retItem.append((String)childMap.get(address2[count]));
			}
			retItem.append(JCRStrConst.TAB_CD);
			for(int count = 0; count < address3.length; count++)
			{
				retItem.append((String)childMap.get(address3[count]));
			}
			retItem.append(JCRStrConst.TAB_CD);
			// 請求書番号|申込書番号|お客様名漢字|お客様名カナ|ＳＹＳＩＤ|発送区分|備考|
			for(int count = 0; count < keyItem2.length; count++)
			{
				retItem.append((String)childMap.get(keyItem2[count]));
				retItem.append(JCRStrConst.TAB_CD);
			}
			// バーコード|
			for(int count = 0; count < barCode.length; count++)
			{
				if(count > 0)
				{
					retItem.append(JCRStrConst.STR_HALF_COMMA);
				}
				retItem.append("\"").append((String)childMap.get(barCode[count])).append("\"");
			}
			retItem.append(commonItem.toString());
			retItem.append(JCRStrConst.KAIGYO_CD);
		}
		return retItem.toString().getBytes("UTF-8");
	}

	/**
	 * 宛名ラベルに出力するデータを作成します
	 * 
	 * @param param リクエストパラメータ
	 * @param scNm  サービスコンポーネント名
	 * @param listNm リスト名
	 * @param scNm2 サービスコンポーネント名
	 * @param zipCode 郵便番号項目名
	 * @param address1 住所項目名１
	 * @param address2 住所項目名２
	 * @param address3 住所項目名３
	 * @param sohusnm 送付先名
	 * @param barCode バーコード項目名
	 * @return ラベル出力データ
	 * @throws RequestParameterException
	 * @throws UnsupportedEncodingException 
	 */
	@SuppressWarnings("unchecked")
	public static byte[] makeLabelData(IRequestParameterReadOnly param,String scNm, String listNm, String scNm2, 
			String zipCode, String[] address1, String[] address2, String[] address3, String sohusnm, String[] barCode) throws RequestParameterException, UnsupportedEncodingException
	{
		// 検索日
		String serchDate = JCRUtilCommon.formatDate(JCCBPCommon.getSysDateTime(), JCRStrConst.FMT_YMDHMS ,JCRStrConst.FMT_EDIT_YMDHM);

		StringBuilder retItem = new StringBuilder();
		Map<Object, Object> inMap = (Map<Object, Object>)param.getData(scNm);
		List<HashMap<String, Object>> inList = (List<HashMap<String, Object>>)inMap.get(listNm);

		for(int i = 0; i < inList.size(); i++)
		{
			Map<String, Object> childMap = inList.get(i);

			// 送付先郵便番号|
			retItem.append((String)childMap.get(zipCode)).append(JCRStrConst.TAB_CD);
			// 送付先住所１|
			for(int count = 0; count < address1.length; count++)
			{
				retItem.append((String)childMap.get(address1[count]));
			}
			retItem.append(JCRStrConst.TAB_CD);
			// 送付先住所２|
			for(int count = 0; count < address2.length; count++)
			{
				retItem.append((String)childMap.get(address2[count]));
			}
			retItem.append(JCRStrConst.TAB_CD);
			// 送付先住所３|
			for(int count = 0; count < address3.length; count++)
			{
				//ANK-3745-00-00 ADD START
				//建物名と部屋番号が登録されている場合、建物名と部屋番号の間に"　"を挿入
				String digit = (String)(childMap.get(address3[0]) + (String)(childMap.get(address3[1])));
				if (digit.length() < 60)
				{
					if(StringUtils.isNotBlank((String) childMap.get(address3[0])) && StringUtils.isNotBlank((String) childMap.get(address3[1])))
					{
						if(count == 1)
						{
							childMap.put(address3[1],"　" + childMap.get(address3[1]));
						}
					}
				}
				//ANK-3745-00-00 ADD END
				retItem.append((String)childMap.get(address3[count]));
			}
			retItem.append(JCRStrConst.TAB_CD);
			// 送付先名|
			retItem.append((String)childMap.get(sohusnm)).append("　様").append(JCRStrConst.TAB_CD);
			// 検索日|
			retItem.append(serchDate).append(JCRStrConst.TAB_CD);
			// バーコード|
			for(int count = 0; count < barCode.length; count++)
			{
				if(count > 0)
				{
					retItem.append(JCRStrConst.STR_HALF_COMMA);
				}
				else
				{
					// 対応記録番号|
					retItem.append((String)childMap.get(barCode[0])).append(JCRStrConst.TAB_CD);
					// 資料送付番号|
					retItem.append((String)childMap.get(barCode[1])).append(JCRStrConst.TAB_CD);
					// 資料送付記録番号|
					retItem.append((String)childMap.get(barCode[2])).append(JCRStrConst.TAB_CD);
				}
				retItem.append("\"").append((String)childMap.get(barCode[count])).append("\"");
			}
			retItem.append(JCRStrConst.KAIGYO_CD);
		}
		return retItem.toString().getBytes("UTF-8");
	}

	/**
	 * クエリ項目に関連するカテゴリーレベルを返却します
	 * 
	 * @param queryItem クエリ項目
	 * @return カテゴリーレベル
	 */
	public static String getCtgrLv(String queryItem)
	{
		String ctgrLv = null;

		if (JCRStrConst.QUERY_ITEM_NM_CTGR_WKGRP.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_001;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CTGR_1.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_002;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CTGR_2.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_003;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CTGR_3.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_004;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CTGR_4.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_005;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CTGR_5.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_006;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CTGR_6.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_007;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CTGR_7.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_008;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CTGR_8.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_009;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CTGR_9.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_010;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CTGR_10.equals(queryItem))
		{
			ctgrLv = JCRStrConst.CTGR_LV_011;
		}

		return ctgrLv;
	}

	/**
	 * クエリ項目に関連するコード種別コードを返却します
	 * 
	 * @param queryItem クエリ項目
	 * @return コード種別コード
	 */
	public static String getCdSbtCd(String queryItem)
	{
		String cdSbt = null;

		if (JCRStrConst.QUERY_ITEM_NM_OUTAI.equals(queryItem))
		{
			cdSbt = JCRStrConst.CD_SBT_TIAWS_OUTAI;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_JOTAI.equals(queryItem))
		{
			cdSbt = JCRStrConst.CD_SBT_TOIAWASE_STAT_CD;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_STATUS.equals(queryItem))
		{
			cdSbt = JCRStrConst.CD_SBT_TAIO_KIROK_STAT;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_TIAWS_DIV.equals(queryItem))
		{
			cdSbt = JCRStrConst.CD_SBT_TIAWS_UKTKSBT_CD;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CST_TYPE.equals(queryItem))
		{
			cdSbt = JCRStrConst.CD_SBT_CST_TYPE_CD;
		}
		else if (JCRStrConst.QUERY_ITEM_NM_CONTACT_SAKI.equals(queryItem))
		{
			cdSbt = JCRStrConst.CD_SBT_CONTACT_SAKI_CD;
		}

		return cdSbt;
	}

	/**
	 * クエリ項目がカテゴリーか判定します
	 * 
	 * @param queryItem クエリ項目
	 * @return true:カテゴリー false:カテゴリー以外
	 */
	public static boolean judgeCtgr(String queryItem)
	{
		if (JCRStrConst.QUERY_ITEM_NM_CTGR_WKGRP.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CTGR_1.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CTGR_2.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CTGR_3.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CTGR_4.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CTGR_5.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CTGR_6.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CTGR_7.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CTGR_8.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CTGR_9.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CTGR_10.equals(queryItem))
			{
			return true;
		}

		return false;
	}

	/**
	 * クエリ項目がワークグループか判定します
	 * 
	 * @param queryItem クエリ項目
	 * @return true:ワークグループ false:ワークグループ以外
	 */
	public static boolean judgeWkgrp(String queryItem)
	{
		if (JCRStrConst.QUERY_ITEM_NM_RECEIPT_WKGRP.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CHARGE_WKGRP.equals(queryItem))
		{
			return true;
		}

		return false;
	}

	/**
	 * クエリ項目がコード種別コードか判定します
	 * 
	 * @param queryItem クエリ項目
	 * @return true:コード種別コード false:コード種別コード以外
	 */
	public static boolean judgeCdSbtCd(String queryItem)
	{
		if (JCRStrConst.QUERY_ITEM_NM_OUTAI.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_JOTAI.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_STATUS.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_TIAWS_DIV.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CST_TYPE.equals(queryItem)
				|| JCRStrConst.QUERY_ITEM_NM_CONTACT_SAKI.equals(queryItem))
			{
			return true;
		}

		return false;
	}

	/**
	 * クエリ項目がキューBOXか判定します
	 * 
	 * @param queryItem クエリ項目
	 * @return true:キューBOX false:キューBOX以外
	 */
	public static boolean judgeQbox(String queryItem)
	{
		if (JCRStrConst.QUERY_ITEM_NM_QBOX.equals(queryItem))
		{
			return true;
		}

		return false;
	}

	/**
	 * クエリ項目が集約局か判定します
	 * 
	 * @param queryItem クエリ項目
	 * @return true:集約局 false:集約局以外
	 */
	public static boolean judgeSyuyakkyok(String queryItem)
	{
		if (JCRStrConst.QUERY_ITEM_NM_SYUYAKKYOK.equals(queryItem))
		{
			return true;
		}

		return false;
	}

	/**
	 * あいまい検索ｅｏＩＤ時のｅｏＩＤを設定します
	 * 
	 * @param param リクエストパラメータ
	 * @param searchEoIdMapId あいまい検索マップID
	 * @return eoID
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public static String getFuzzyEoID(IRequestParameterReadOnly param, String searchEoIdMapId) throws RequestParameterException
	{
		/* ユーザデータ情報 */
		HashMap<Object, Object> inMap = (HashMap<Object, Object>)param.getData(searchEoIdMapId);

		StringBuilder eoIDBuff = new StringBuilder();
		if (JCRStrConst.FUZZY_SEARCH_ON.equals(inMap.get("fuzzy_search")))
		{
			List<Map<String, Object>> inList = (List<Map<String, Object>>)inMap.get("ECK0011B506CBSMsg1List");

			if (inList == null || inList.size() == 0)
			{
				return (String) inMap.get("key_eoid");
			}
			
			// eoIDあいまい検索一覧照会結果からeoIDを取得
			List<String> eoIDList = new ArrayList<String>();
			for (int i = 0; i < inList.size(); i++)
			{
				eoIDList.add((String)inList.get(i).get("eoid"));
			}
			// eoIDの重複除去
			HashSet<String> eoIDSet = new HashSet<String>();
			eoIDSet.addAll(eoIDList);
			// あいまい検索用eoID生成
			Object[] eoIDs = eoIDSet.toArray();
			for (int i = 0; i < eoIDs.length; i++)
			{
				if (i > 0)
				{
					eoIDBuff.append(JCRStrConst.FUZZY_SEARCH_KUGIRI);
				}
				eoIDBuff.append((String)eoIDs[i]);
			}
		}
		else
		{
			return (String) inMap.get("key_eoid");
		}

		return eoIDBuff.toString();
	}

}
