/*********************************************************************
* All Right reserved,Copyright (c) Fujitsu, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：料金システム
*   ソースファイル名：JACCommonUtil.java
*   作成者          ：富士通
*   日付            ：2012年02月03日
*＜機能概要＞
*   料金システムの共通処理クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/02/03   FJ          新規作成
*	v32.00.01	2017/05/15	 FJ)西面    【ANK-2996-02-00】SMSを利用した即時決済
*	v59.00.00	2022/04/18	 FJ)吉田	【ANK-4160-00-00】SMBC即時決済入金会計システム化対応
**********************************************************************/
package eo.common.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.util.ArrayList;

import eo.common.constant.JACStrConst;

/**
 * 料金システム共通処理
 *
 */
public class JACCommonUtil
{
	/** 丸め方法：四捨五入 */
	private static final String ROUND_OFF 		= "1";

	/** 丸め方法：切上げ */
	private static final String ROUND_UP 			= "2";

	/** 丸め方法：切捨て */
	private static final String ROUND_DOWN 		= "3";

	/**
	 * 氏名を格納したリストの並び順を編集します。
	 * <br>
	 * @param nameList 氏名リスト
	 * @return 編集後の氏名リスト
	 */
	public static ArrayList<String> editNameList(ArrayList<String> nameList)
	{
		ArrayList<String> resultNameList = new ArrayList<String>(nameList);
		int lastIndex = nameList.size() - 1;
		for (int i = lastIndex; i >= 0; i--)
		{
			String name = nameList.get(i);
			if (null == name || "".equals(name))
			{
				resultNameList.add(0, resultNameList.remove(lastIndex));
			}
			else
			{
				break;
			}
		}
		return resultNameList;
	}

	/**
     * 小数点第一位による丸め処理を行います。<BR>
     * 負の数の場合は絶対値を丸めた数に-1を乗算します。
     * <BR>
     * @param roundWay 丸め方法 1:四捨五入、2:切り上げ、3:切捨て、左記以外:丸めなし
     * @param num 丸め処理前の数値
     * @param keta 小数点以下の桁数
     * @return double 丸め処理後の数値
     */
	public static BigDecimal round(String roundWay, BigDecimal num, int keta)
	{
		if(num.compareTo(BigDecimal.ZERO) == 0)
		{
			return BigDecimal.ZERO;
		}
		
		BigDecimal retNum = null;

		// 符号を設定する
		 BigDecimal sign = new BigDecimal(num.signum());

		// 絶対値を取得する
		BigDecimal absNum = num.abs();

		// 丸め方法に従い、絶対値での丸め処理を行う
		// 四捨五入
		if (ROUND_OFF.equals(roundWay))
		{
			retNum = absNum.setScale(keta, RoundingMode.HALF_UP);
		}
		// 切上げ
		else if (ROUND_UP.equals(roundWay))
		{
			retNum = absNum.setScale(keta, RoundingMode.CEILING);
		}
		// 切捨て
		else if (ROUND_DOWN.equals(roundWay))
		{
			retNum = absNum.setScale(keta, RoundingMode.FLOOR);
		}
		// 丸めなし
		else
		{
			retNum = absNum;
		}

		// 符号を元に戻す
		retNum = retNum.multiply(sign);

		return retNum;
	}

	/**
	 * 文字列が指定された文字数以上の場合、文字列を編集します。
	 * <br>
	 * @param editStr 編集前の文字列
	 * @param strLength 指定文字数
	 * @return 編集後の文字列
	 */
	public static String editStrLength(String editStr, int strLength)
	{
		String resultStr = JACStrConst.KARA_MOJI;
		if(!"".equals(editStr) && editStr.length() > strLength)
		{
			resultStr = editStr.substring(0, strLength);
		}
		else
		{
			resultStr = editStr;
		}
		return resultStr;
	}
	
//v32.00.01 2017/05/15 Add Start
	/**
	 * 引数として渡された年月日(YYYMMDD）の当月末日を返却する
	 * @param syunoYmd 収納年月日
	 * @return 収納年月の末日(YYYYMMDD) 引数が空またはnullの場合はそのまま返却する
	 */
	public static String getKsdkcpCvsPayRsvYmd(String syunoYmd)
	{
		//収納年月日
		String shunoYm = "";
		
		//nullチェックを実施
		if (syunoYmd == null || "".equals(syunoYmd))
		{
			return syunoYmd;
		}
		
		//収納年月日(YYYYMMDD)をYYYYMM形式に変更する
		shunoYm = syunoYmd.substring(0,6);
		
		String endYmd = shunoYm + JPCDateUtil.getEndOfMonth(shunoYm);
		//収納年月に末日を設定し、返却する
		
		return endYmd;
	}
//v32.00.01 2017/05/15 Add End
// v59.00.00 2022/04/18 ANK-4160-00-00 ADD START
	/**
	 * 引数として渡された年月日(YYYMMDD）の翌月15日を返却する
	 * @param syunoYmd 収納年月日
	 * @return 収納年月の翌月15日(YYYYMMDD) 引数が空またはnullの場合はそのまま返却する
	 * @throws Exception 
	 */
	public static String getKsdkcpCvsPayRsvYmd2(String syunoYmd) throws Exception
	{
		
		//nullチェックを実施
		if (syunoYmd == null || "".equals(syunoYmd))
		{
			return syunoYmd;
		}
		
		//収納年月の翌15日を設定し、返却する
		String returnYmd = JPCUtilCommon.addMonth(syunoYmd, 1);
		returnYmd = returnYmd.substring(0, 6) + "15";
		
		return returnYmd;
	}
	// v59.00.00 2022/04/18 ANK-4160-00-00 ADD END
}
