/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKKapPlanCdConv
*	ソースファイル名：JKKKapPlanCdConv.java
*	作成者			：富士通
*	日付			：2019年06月04日
*＜機能概要＞
*	割賦プランコード変換部品(税率改定過渡期用)クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v45.00.00	2019/06/04	FJ)謝		【ANK-3636-00-00】消費増税対応（8%⇒10%） 新規作成
*	v53.00.00	2021/04/05	FJ)謝		【ANK-3951-00-00】「競争ルールの検証に関するWG」に関するシステム対応
**********************************************************************/
package eo.common.util;

import eo.common.constant.JKKStrConst;

/**
 * 割賦プランコード変換部品(税率改定過渡期用)クラスです。<p>
 * <BR>
 * @author 富士通
 */
public class JKKKapPlanCdConv
{
	/**
	 * 税率変更対応表
	 * 項目1:割賦プランコード(8%)
	 * 項目2:割賦プランコード(10%)
	 * 項目3:割賦プランコード(8%/10%)
	 */
	private static final String[][] TAX_CHGE_ARRAY =
		{ {"KP0031", "KP0131", "KP1131"}
		, {"KP0030", "KP0130", "KP1130"}
		, {"KP0033", "KP0133", "KP1133"}
		, {"KP0032", "KP0132", "KP1132"}
		, {"KP0035", "KP0135", "KP1135"}
		, {"KP0034", "KP0134", "KP1134"}
		, {"KP0037", "KP0137", "KP1137"}
		, {"KP0036", "KP0136", "KP1136"}
		, {"KP0039", "KP0139", "KP1139"}
		, {"KP0038", "KP0138", "KP1138"}
		, {"KP0043", "KP0143", "KP1143"}
		, {"KP0042", "KP0142", "KP1142"}
		, {"KP0045", "KP0145", "KP1145"}
		, {"KP0044", "KP0144", "KP1144"}
		, {"KP0041", "KP0141", ""}
		, {"KP0040", "KP0140", ""}
// ANK-3951-00-00 ADD START
		, {"", "KP0146", ""}
// ANK-3951-00-00 ADD END
		};
	
	/** 税率変更対応表インデックス(8%) */
	private static final int TAX_8 = 0;
	
	/** 税率変更対応表インデックス(10%) */
	private static final int TAX_10 = 1;
	
	/** 税率変更対応表インデックス(8%/10%) */
	private static final int TAX_8_10 = 2;
	
	/**
	 * 支払方法変更対応表
	 * 項目1:割賦プランコード(一括)
	 * 項目2:割賦プランコード(割賦(２４回))
	 * 項目3:割賦プランコード(割賦(３６回))
	 * 項目4:割賦プランコード(割賦(３０回))
	 */
	private static final String[][] PAY_WAY_CHGE_ARRAY =
		{ {"KP0031", "KP0030", "", ""}
		, {"KP0131", "KP0130", "", ""}
		, {"KP1131", "KP1130", "", ""}
		, {"KP0033", "KP0032", "", ""}
		, {"KP0133", "KP0132", "", ""}
		, {"KP1133", "KP1132", "", ""}
		, {"KP0035", "KP0034", "", ""}
		, {"KP0135", "KP0134", "", ""}
		, {"KP1135", "KP1134", "", ""}
		, {"KP0036", "", "", ""}
		, {"KP0136", "", "", ""}
		, {"KP1136", "", "", ""}
		, {"KP0037", "", "", ""}
		, {"KP0137", "", "", ""}
		, {"KP1137", "", "", ""}
		, {"KP0039", "KP0038", "", ""}
		, {"KP0139", "KP0138", "", ""}
		, {"KP1139", "KP1138", "", ""}
		, {"KP0043", "KP0042", "", ""}
		, {"KP0143", "KP0142", "", ""}
		, {"KP1143", "KP1142", "", ""}
		, {"KP0045", "KP0044", "", ""}
		, {"KP0145", "KP0144", "", ""}
		, {"KP1145", "KP1144", "", ""}
		, {"KP0041", "", "", "KP0040"}
// ANK-3951-00-00 MOD START
//		, {"KP0141", "", "", "KP0140"}
		, {"KP0141", "KP0146", "", "KP0140"}
// ANK-3951-00-00 MOD END
		};
	
	/** 支払方法変更対応表インデックス(一括) */
	private static final int PAY_WAY_IKKATSU = 0;
	
	/** 支払方法変更対応表インデックス(割賦(２４回)) */
	private static final int PAY_WAY_KAPPU_24 = 1;
	
	/** 支払方法変更対応表インデックス(割賦(３６回)) */
	private static final int PAY_WAY_KAPPU_36 = 2;
	
	/** 支払方法変更対応表インデックス(割賦(３０回)) */
	private static final int PAY_WAY_KAPPU_30 = 3;
	
	/** 年月日(20191001) */
	private static final String YMD_20191001 = "20191001";
	
	/**
	 * 割賦プランコード変換処理
	 * @param kapPlanCd 割賦プランコード
	 * @param chgeDiv 変更区分
	 * @param mskmYmd 申込年月日
	 * @param fixYmd 確定年月日
	 * @param chgeSkHambaiFormCd 変更先販売形態コード
	 * @return 変換後割賦プランコード
	 * throws Exception
	 */
	public static String convKapPlanCd(String kapPlanCd, String chgeDiv, String mskmYmd, String fixYmd, String chgeSkHambaiFormCd) throws Exception
	{
		// 入力パラメータチェックを行う
		// 割賦プランコードが設定されていない場合
		if (JKKStringUtil.isNullBlank(kapPlanCd))
		{
			throw new Exception("割賦プランコードを設定してください。");
		}
		
		// 変更区分が1(税率)の場合
		if (JKKStrConst.CHGE_DIV_TAX.equals(chgeDiv))
		{
			// 申込年月日が設定されている かつ 確定年月日が設定されていない場合
			if (!JKKStringUtil.isNullBlank(mskmYmd) && JKKStringUtil.isNullBlank(fixYmd))
			{
				// 申込年月日の妥当性チェックを行う
				if (!JPCUtilCommon.checkDate(mskmYmd, 8))
				{
					throw new Exception("申込年月日は日付として認識できません。");
				}
			}
			// 申込年月日が設定されていない かつ 確定年月日が設定されている場合
			else if (JKKStringUtil.isNullBlank(mskmYmd) && !JKKStringUtil.isNullBlank(fixYmd))
			{
				// 確定年月日の妥当性チェックを行う
				if (!JPCUtilCommon.checkDate(fixYmd, 8))
				{
					throw new Exception("確定年月日は日付として認識できません。");
				}
			}
			// 上記以外の場合
			else
			{
				throw new Exception("変更区分が1(税率)の場合、申込年月日と確定年月日はどちらか一方を設定してください。");
			}
		}
		// 変更区分が2(支払方法)の場合
		else if (JKKStrConst.CHGE_DIV_PAY_WAY.equals(chgeDiv))
		{
			// 変更先販売形態コードは01(一括)、02(割賦(24回))、03(割賦(36回))、04(割賦(30回))以外の場合
			if (!JKKStrConst.CD01467_IKKATSU.equals(chgeSkHambaiFormCd)
					&& !JKKStrConst.CD01467_KAPPU_24.equals(chgeSkHambaiFormCd)
					&& !JKKStrConst.CD01467_KAPPU_36.equals(chgeSkHambaiFormCd)
					&& !JKKStrConst.CD01467_KAPPU_30.equals(chgeSkHambaiFormCd))
			{
				throw new Exception("変更区分が2(支払方法)の場合、変更先販売形態コードは01(一括)、02(割賦(24回))、03(割賦(36回))、04(割賦(30回))で設定してください。");
			}
		}
		// 上記以外の場合
		else
		{
			throw new Exception("変更区分は1(税率)、2(支払方法)で設定してください。");
		}
		
		// 変換後割賦プランコード
		String retKapPlanCd = "";
		
		// 変更区分が1(税率)の場合
		if (JKKStrConst.CHGE_DIV_TAX.equals(chgeDiv))
		{
			// 割賦プランコードと同一の配列を取得する
			String[] convArrayTax = getConvArray(TAX_CHGE_ARRAY, kapPlanCd);
			
			// 取得できない場合、NULLを返却する
			if (convArrayTax == null)
			{
				return null;
			}
			
			// 申込年月日が設定されている場合
			if (!JKKStringUtil.isNullBlank(mskmYmd))
			{
				// 申込年月日が"20191001"以降の場合
				if (YMD_20191001.compareTo(mskmYmd) <= 0)
				{
					retKapPlanCd = convArrayTax[TAX_10];
				}
				// 上記以外の場合
				else
				{
					retKapPlanCd = getNotNullValue(convArrayTax[TAX_8], convArrayTax[TAX_10]);
				}
			}
			// 確定年月日が設定されている場合
			else if (!JKKStringUtil.isNullBlank(fixYmd))
			{
				// 確定年月日が"20191001"以降の場合
				if (YMD_20191001.compareTo(fixYmd) <= 0)
				{
					retKapPlanCd = convArrayTax[TAX_10];
					
					// 8%/10%に対応する割賦プランコードが設定されている かつ
					// 取得した割賦プランコードと入力パラメータの割賦プランコードが異なる場合
					if (!JKKStringUtil.isNullBlank(convArrayTax[TAX_8_10]) && !retKapPlanCd.equals(kapPlanCd))
					{
						retKapPlanCd = convArrayTax[TAX_8_10];
					}
				}
				// 上記以外の場合
				else
				{
					retKapPlanCd = getNotNullValue(convArrayTax[TAX_8], convArrayTax[TAX_10]);
				}
			}
		}
		// 変更区分が2(支払方法)の場合
		else if (JKKStrConst.CHGE_DIV_PAY_WAY.equals(chgeDiv))
		{
			// 割賦プランコードと同一の配列を取得する
			String[] convArrayPayWay = getConvArray(PAY_WAY_CHGE_ARRAY, kapPlanCd);
			
			// 取得できない場合、NULLを返却する
			if (convArrayPayWay == null)
			{
				return null;
			}
			
			// 変更先販売形態コードが01(一括)の場合
			if (JKKStrConst.CD01467_IKKATSU.equals(chgeSkHambaiFormCd))
			{
				retKapPlanCd = convArrayPayWay[PAY_WAY_IKKATSU];
			}
			// 変更先販売形態コードが02(割賦(24回))の場合
			else if (JKKStrConst.CD01467_KAPPU_24.equals(chgeSkHambaiFormCd))
			{
// ANK-3951-00-00 ADD START
				// 割賦プランコードがKP0041(一括(8%))、KP0040(割賦(30回)(8%))の場合
				if (JKKStrConst.KAP_PLAN_CD_IKKATSU.equals(kapPlanCd)
						|| JKKStrConst.KAP_PLAN_CD_BUNKATSU.equals(kapPlanCd))
				{
					throw new Exception("税率8%に対して、販売形態コードに02(割賦(24回)を設定することはできません。");
				}
// ANK-3951-00-00 ADD END
				retKapPlanCd = convArrayPayWay[PAY_WAY_KAPPU_24];
			}
			// 変更先販売形態コードが03(割賦(36回))の場合
			else if (JKKStrConst.CD01467_KAPPU_36.equals(chgeSkHambaiFormCd))
			{
				retKapPlanCd = convArrayPayWay[PAY_WAY_KAPPU_36];
			}
			// 変更先販売形態コードが04(割賦(30回))の場合
			else if (JKKStrConst.CD01467_KAPPU_30.equals(chgeSkHambaiFormCd))
			{
				retKapPlanCd = convArrayPayWay[PAY_WAY_KAPPU_30];
			}
		}
		
		// 取得できない場合、NULLを返却する
		if (JKKStringUtil.isNullBlank(retKapPlanCd))
		{
			return null;
		}
		
		return retKapPlanCd;
	}
	
	/**
	 * 割賦プランコードと同一の配列を取得する
	 * @param convArray2D 2次元配列
	 * @param kapPlanCd 割賦プランコード
	 * @return 割賦プランコードと同一の配列
	 */
	private static String[] getConvArray(String[][] convArray2D, String kapPlanCd)
	{
		for (int i = 0; i < convArray2D.length; i++)
		{
			for (int j = 0; j < convArray2D[i].length; j++)
			{
				if (kapPlanCd.equals(convArray2D[i][j]))
				{
					return convArray2D[i];
				}
			}
		}
		return null;
	}
	
	/**
	 * 指定された文字列でNullかつ""でない文字列を返却する
	 * 返却の優先順位はvalue1,value2とする
	 * @param value1 文字列1
	 * @param value2 文字列2
	 * @return String nullかつ""でない方の文字列（返却の優先順位はvalue1,value2とする）
	 */
	private static String getNotNullValue(String value1, String value2)
	{
		if(!JKKStringUtil.isNullBlank(value1))
		{
			return value1;
		}
		if(!JKKStringUtil.isNullBlank(value2))
		{
			return value2;
		}
		return "";
	}
}