/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUFrontDispSetting
*   ソースファイル名：JFUFrontDispSetting.java
*   作成者          ：富士通
*   日付            ：2011年06月02日
*＜機能概要＞
*   フロント画面表示用XML定義情報出力部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/06/02   FJ）和田    新規作成
*   v47.00.00   2019/09/26   FJ）大島    ANK-3715-00-00_提供条件リリース対応
*
**********************************************************************/
package eo.web.webview.common;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;

import com.fujitsu.futurity.web.x33.X33VCustomTagBase;

/**
 * フロント画面表示用XML定義情報出力部品です。
 * <br>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class JFUFrontDispSetting extends X33VCustomTagBase
{
	/** メッセージリストのテンプレートID */
	private static final String TEMPLATE_ID = "TagTemplate001";

	/** フロント区分の項目ID */
	private static final String FU_OPEDATE = "FU_OPEDATE";

	/** SETTING要素のscreenId属性 */
	private String screenId = "";

	/** OUTLINK要素のid属性 */
	private String outlinkId = "";

	/** DISPTEXT要素のid属性 */
	private String textId = "";

	/** フォーマット */
	private String formatType = "";

	/** 開始日 */
	private String startYmd = "";

	/** 終了日 */
	private String endYmd = "";

	/** フォーマットタイプ：西暦（日本語ゼロ省略） */
	private static final String FORMAT_TYPE_YYYYMD_JP_SUPR_ZERO = "YYYYMD_JP_SUPR_ZERO";

	/**
	 * 画面IDを設定します。
	 * <br>
	 * @param arg0 画面ID
	 */
	public void setScreenId(String arg0)
	{
		this.screenId = arg0;
	}

	/**
	 * 外部リンクIDを設定します。
	 * <br>
	 * @param arg0 外部リンクID
	 */
	public void setOutlinkId(String arg0)
	{
		this.outlinkId = arg0;
	}

	/**
	 * テキストIDを設定します。
	 * <br>
	 * @param arg0 テキストID
	 */
	public void setTextId(String arg0)
	{
		this.textId = arg0;
	}

	/**
	 * フォーマットを設定します。
	 * <br>
	 * @param arg0 フォーマット
	 */
	public void setFormatType(String arg0)
	{
		this.formatType = arg0;
	}

	/**
	 * 開始日付を設定します。
	 * <br>
	 * @param arg0 フォーマット
	 */
	public void setStartYmd(String arg0)
	{
		this.startYmd = arg0;
	}

	/**
	 * 終了日付を設定します。
	 * <br>
	 * @param arg0 フォーマット
	 */
	public void setEndYmd(String arg0)
	{
		this.endYmd = arg0;
	}

	/**
	 * カスタムタグ開始処理を行います。
	 * <br>
	 * @throws	JspException JSPで発生する例外
	 * @return 処理結果
	 * @see javax.servlet.jsp.tagext.TagSupport#doStartTag()
	 */
	@Override
	public int doStartTag() throws JspException
	{
		try
		{
			String text = "";
			if (this.outlinkId.length() != 0)
			{
				JFULinkSettingCache linkProp = JFULinkSettingCache.getInstance();
				text = linkProp.getLink(this.screenId, this.outlinkId);
			}
			else if (this.textId.length() != 0)
			{
				try {
					JFUDispSettingExtraCache dispExtraProp = JFUDispSettingExtraCache.getInstance();
					if (dispExtraProp != null) {
// ANK-3715-00-00 MOD START
						// 運用日付を取得。
						String opeDate = getOpeDate();
						text = dispExtraProp.getText(this.screenId, this.textId, opeDate);
// ANK-3715-00-00 MOD END
					}
				}
				catch (Exception e)
				{
					// 特別設定用（上書き設定）なので取得できなくても無視
				}

				if (JFUWebCommon.isNull(text)) {
					JFUDispSettingCache dispProp = JFUDispSettingCache.getInstance();
					text = dispProp.getText(this.screenId, this.textId);
				}
			}

			if (this.startYmd.length() == 8 || this.endYmd.length() == 8)
			{
				// 運用日付を取得。
				String opeDate = getOpeDate();

				if (opeDate != null && opeDate.length() == 8)
				{
					if (this.startYmd.length() == 8 && startYmd.matches("^[0-9]+$") && Integer.parseInt(opeDate) < Integer.parseInt(this.startYmd))
					{
						// 開始日付が8桁で、且つ運用日付が開始日付に到達していない場合
						text = "";
					}

					if (this.endYmd.length() == 8 && endYmd.matches("^[0-9]+$") && Integer.parseInt(this.endYmd) < Integer.parseInt(opeDate))
					{
						// 終了日付が8桁で、且つ運用日付が終了日付を過ぎている場合
						text = "";
					}
				}
			}

			if (this.formatType.length() != 0) {
				text = convFormat(text);
			}

			// 取得値の出力
			outputHtml(text);
		}
		catch (Exception e)
		{
			throw new JspException("Error:" + e.getMessage());
		}
		return SKIP_BODY;
	}

	/**
	 * フォーマットを設定します。
	 * <br>
	 * @param arg0 フォーマット
	 */
	private String convFormat(String text)
	{
		String convString = text;
		if (FORMAT_TYPE_YYYYMD_JP_SUPR_ZERO.equals(formatType)) {
			convString = convADJPSuppressZeroString(convString);
		}

		return convString;
	}

	/**
	 * <DL>
	 * <DT>運用日付を取得します。
	 * </DL>
	 * @return
	 * @throws JspException
	 */
	private String getOpeDate() throws JspException
	{
		return getSFBeanData_String(TEMPLATE_ID, FU_OPEDATE);
	}

	/**
	 * yyyyMMddからyyyy年MM月dd日形式に変換する。
	 * 指定された文字列がyyyyMMdd形式でない場合、何も行わず指定された文字列を返却する。
	 *
	 * <br>
	 * @param dateString yyyyMMdd形式の文字列
	 * @return yyyy年M月d日形式の文字列
	 */
	private String convADJPSuppressZeroString(String dateString)
	{

		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

		Date wareki = null;

		try
		{
			wareki = sdf.parse(dateString);
		}
		catch (ParseException e)
		{
			return dateString;
		}

		sdf.applyPattern("yyyy年M月d日");

		return sdf.format(wareki);
	}
}
