//===========================================================================
// package
//===========================================================================
package jp.gr.java_conf.bugslife.form;

//===========================================================================
// import
//===========================================================================
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

import java.io.UnsupportedEncodingException;

import java.util.*;
import java.text.*;

import jp.gr.java_conf.bugslife.util.*;

/**
 *<PRE>
 * Formクラス
 *
 *</PRE>
 * @author 鰐川　正寛
 * @version 1.0.0
 */
public class BugDetail3Form extends ActionForm {
//===========================================================================
// attributes
//===========================================================================
	/**
	 * アクション
	 */
	private String m_action;
	/**
	 * 故障番号
	 */
	private int m_bno;
	/**
	 * 連絡事項
	 */
	private String m_addText;
	/**
	 * 故障原因
	 */
	private String m_resolution;
	/**
	 * 仕変番号
	 */
	private String m_scid;
	/**
	 * 提供予定日
	 */
	private Date m_releaseSchDate;
	/**
	 * 提供予定日
	 */
	private String m_releaseSchDateString;
	/**
	 * エラー内容
	 */
	private String m_errorType;
	/**
	 * エラー原因
	 */
	private String m_errorCause;
	/**
	 * エラー機能
	 */
	private String m_errorPoint;
	/**
	 * 混入工程
	 */
	private String m_trainPno;
	/**
	 * 摘出すべき工程
	 */
	private String m_shouldFindPno;
	/**
	 * 摘出遅延理由
	 */
	private String m_errorDelayReason;
	/**
	 * サブミットタイプ
	 */
	private String m_submitType = DEFAULT_STATUS;
	/**
	 * 要求ステータス状況
	 */
	private String m_requestStatusWhitebord;
	/**
	 * 要求ステータス
	 */
	private String m_requestStatus;
	/**
	 * 修正担当者
	 */
	private String m_requestUpdater;
	/**
	 * 解析担当者
	 */
	private String m_requestAnalyst;
	/**
	 * 担当者
	 */
	private String m_requestAssigne;
	/**
	 * コンポーネントＩＤ
	 */
	private String m_requestCpid;
	/**
	 * 関連バグ削除依頼
	 */
	private String m_delDepends;
	/**
	 * 削除関連バグ
	 */
	private String m_delDependBno;
	/**
	 * 関連バグ追加依頼
	 */
	private String m_addDepends;
	/**
	 * 追加関連バグ
	 */
	private String m_addDependBno;
	/**
	 * メール送信要否
	 */
	private boolean m_dontSendMail;
	/**
	 * Log
	 */
	private Log log = LogFactory.getLog(this.getClass().getName());
//===========================================================================
// other attribute
//===========================================================================
	private static final String DEFAULT_STATUS = "repairedSelf";
	/**
	 * 提供予定日フォーマット
	 */
	private static final String RELSCH_DATE_FORMAT = Converter.MMDD_PATTAN;
	public static final int RELSCH_DATE = Converter.MMDD;
//===========================================================================
// methods
//===========================================================================
	/**
	 * アクションの取得
	 * 
	 * @return アクション
	 */
	public String getAction()
	{
		return m_action;
	}
	/**
	 * アクションのセット
	 * 
	 * @param action アクション
	 */
	public void setAction(String action)
	{
		m_action = action;
	}
	/**
	 * 故障番号の取得
	 * 
	 * @return 故障番号
	 */
	public int getBno()
	{
		return m_bno;
	}
	/**
	 * 故障番号のセット
	 * 
	 * @param bno 故障番号
	 */
	public void setBno(int bno)
	{
		m_bno = bno;
	}
	/**
	 * 連絡事項の取得
	 * 
	 * @return 連絡事項
	 */
	public String getAddText()
	{
		return m_addText;
	}
	/**
	 * 連絡事項のセット
	 * 
	 * @param addText 連絡事項
	 */
	public void setAddText(String addText)
	{
		m_addText = addText;
	}
	/**
	 * 提供予定日の取得
	 * 
	 * @return 提供予定日
	 */
	public Date getReleaseSchDate()
	{
		return m_releaseSchDate;
	}
	/**
	 * 提供予定日のセット
	 * 
	 * @param releaseSchDate 提供予定日
	 */
	public void setReleaseSchDate(Date releaseSchDate)
	{
		m_releaseSchDate = releaseSchDate;
	}
	/**
	 * 提供予定日の取得
	 * 
	 * @return 提供予定日
	 */
	public String getReleaseSchDateString()
	{
		if (m_releaseSchDateString == null) {
			if (m_releaseSchDate != null) {
				m_releaseSchDateString = 
						Converter.getDateString(m_releaseSchDate, RELSCH_DATE);
			}
		}
		return m_releaseSchDateString;
	}
	/**
	 * 提供予定日のセット
	 * 
	 * @param releaseSchDateString 提供予定日
	 */
	public void setReleaseSchDateString(String releaseSchDateString)
	{
		m_releaseSchDateString = releaseSchDateString;
	}
	/**
	 * 故障原因の取得
	 * 
	 * @return 故障原因
	 */
	public String getResolution()
	{
		return m_resolution;
	}
	/**
	 * 故障原因のセット
	 * 
	 * @param resolution 故障原因
	 */
	public void setResolution(String resolution)
	{
		m_resolution = resolution;
	}
	/**
	 * 仕変番号の取得
	 * 
	 * @return 仕変番号
	 */
	public String getScid()
	{
		return m_scid;
	}
	/**
	 * 仕変番号のセット
	 * 
	 * @param scid 仕変番号
	 */
	public void setScid(String scid)
	{
		m_scid = scid;
	}
	/**
	 * エラー内容の取得
	 * 
	 * @return エラー内容
	 */
	public String getErrorType()
	{
		return m_errorType;
	}
	/**
	 * エラー内容のセット
	 * 
	 * @param errorType エラー内容
	 */
	public void setErrorType(String errorType)
	{
		m_errorType = errorType;
	}
	/**
	 * エラー原因の取得
	 * 
	 * @return エラー原因
	 */
	public String getErrorCause()
	{
		return m_errorCause;
	}
	/**
	 * エラー原因のセット
	 * 
	 * @param errorCause エラー原因
	 */
	public void setErrorCause(String errorCause)
	{
		m_errorCause = errorCause;
	}
	/**
	 * エラー機能の取得
	 * 
	 * @return エラー機能
	 */
	public String getErrorPoint()
	{
		return m_errorPoint;
	}
	/**
	 * エラー機能のセット
	 * 
	 * @param errorPoint エラー機能
	 */
	public void setErrorPoint(String errorPoint)
	{
		m_errorPoint = errorPoint;
	}
	/**
	 * 混入工程の取得
	 * 
	 * @return 混入工程
	 */
	public String getTrainPno()
	{
		return m_trainPno;
	}
	/**
	 * 混入工程のセット
	 * 
	 * @param trainPno 混入工程
	 */
	public void setTrainPno(String trainPno)
	{
		m_trainPno = trainPno;
	}
	/**
	 * 摘出すべき工程の取得
	 * 
	 * @return 摘出すべき工程
	 */
	public String getShouldFindPno()
	{
		return m_shouldFindPno;
	}
	/**
	 * 摘出すべき工程のセット
	 * 
	 * @param shouldFindPno 摘出すべき工程
	 */
	public void setShouldFindPno(String shouldFindPno)
	{
		m_shouldFindPno = shouldFindPno;
	}
	/**
	 * 摘出遅延理由の取得
	 * 
	 * @return 摘出遅延理由
	 */
	public String getErrorDelayReason()
	{
		return m_errorDelayReason;
	}
	/**
	 * 摘出遅延理由のセット
	 * 
	 * @param errorDelayReason 摘出遅延理由
	 */
	public void setErrorDelayReason(String errorDelayReason)
	{
		m_errorDelayReason = errorDelayReason;
	}
	/**
	 * サブミットタイプの取得
	 * 
	 * @return サブミットタイプ
	 */
	public String getSubmitType()
	{
		return m_submitType;
	}
	/**
	 * サブミットタイプのセット
	 * 
	 * @param submitType サブミットタイプ
	 */
	public void setSubmitType(String submitType)
	{
		m_submitType = submitType;
	}
	/**
	 * 要求ステータス状況の取得
	 * 
	 * @return 要求ステータス状況
	 */
	public String getRequestStatusWhitebord()
	{
		return m_requestStatusWhitebord;
	}
	/**
	 * 要求ステータス状況のセット
	 * 
	 * @param requestStatusWhitebord 要求ステータス状況
	 */
	public void setRequestStatusWhitebord(String requestStatusWhitebord)
	{
		m_requestStatusWhitebord = requestStatusWhitebord;
	}
	/**
	 * 要求ステータスの取得
	 * 
	 * @return 要求ステータス
	 */
	public String getRequestStatus()
	{
		return m_requestStatus;
	}
	/**
	 * 要求ステータスのセット
	 * 
	 * @param requestStatus 要求ステータス
	 */
	public void setRequestStatus(String requestStatus)
	{
		m_requestStatus = requestStatus;
	}
	/**
	 * 修正担当者の取得
	 * 
	 * @return 修正担当者
	 */
	public String getRequestUpdater()
	{
		return m_requestUpdater;
	}
	/**
	 * 修正担当者のセット
	 * 
	 * @param requestUpdater 修正担当者
	 */
	public void setRequestUpdater(String requestUpdater)
	{
		m_requestUpdater = requestUpdater;
	}
	
	/**
	 * 解析担当者の取得
	 * 
	 * @return 解析担当者
	 */
	public String getRequestAnalyst()
	{
		return m_requestAnalyst;
	}
	/**
	 * 解析担当者のセット
	 * 
	 * @param requestAnalyst 解析担当者
	 */
	public void setRequestAnalyst(String requestAnalyst)
	{
		m_requestAnalyst = requestAnalyst;
	}
	/**
	 * 担当者の取得
	 * 
	 * @return 担当者
	 */
	public String getRequestAssigne()
	{
		return m_requestAssigne;
	}
	/**
	 * 担当者のセット
	 * 
	 * @param requestAssigne 担当者
	 */
	public void setRequestAssigne(String requestAssigne)
	{
		m_requestAssigne = requestAssigne;
	}
	/**
	 * 関連バグ削除依頼の取得
	 * 
	 * @return 関連バグ削除依頼
	 */
	public String getDelDepends()
	{
		return m_delDepends;
	}
	/**
	 * 関連バグ削除依頼のセット
	 * 
	 * @param delDepends 関連バグ削除依頼
	 */
	public void setDelDepends(String delDepends)
	{
		m_delDepends = delDepends;
	}
	/**
	 * 関連バグ追加依頼の取得
	 * 
	 * @return 関連バグ追加依頼
	 */
	public String getAddDepends()
	{
		return m_addDepends;
	}
	/**
	 * 関連バグ追加依頼のセット
	 * 
	 * @param addDepends 関連バグ追加依頼
	 */
	public void setAddDepends(String addDepends)
	{
		m_addDepends = addDepends;
	}
	/**
	 * 削除関連バグ番号の取得
	 * 
	 * @return 削除関連バグ番号
	 */
	public String getDelDependBno()
	{
		return m_delDependBno;
	}
	/**
	 * 削除関連バグ番号のセット
	 * 
	 * @param delDependBno 削除関連バグ番号
	 */
	public void setDelDependBno(String delDependBno)
	{
		m_delDependBno = delDependBno;
	}
	/**
	 * 追加関連バグ番号の取得
	 * 
	 * @return 追加関連バグ番号
	 */
	public String getAddDependBno()
	{
		return m_addDependBno;
	}
	/**
	 * 追加関連バグ番号のセット
	 * 
	 * @param addDependBno 追加関連バグ番号
	 */
	public void setAddDependBno(String addDependBno)
	{
		m_addDependBno = addDependBno;
	}
	/**
	 * 要求コンポーネントＩＤの取得
	 * 
	 * @return 要求コンポーネントＩＤ
	 */
	public String getRequestCpid()
	{
		return m_requestCpid;
	}
	/**
	 * 要求コンポーネントＩＤのセット
	 * 
	 * @param requestCpid 要求コンポーネントＩＤ
	 */
	public void setRequestCpid(String requestCpid)
	{
		m_requestCpid = requestCpid;
	}
	/**
	 * 送信メール要否の取得
	 * 
	 * @return 送信メール要否
	 */
	public boolean getDontSendMail()
	{
		return m_dontSendMail;
	}
	/**
	 * 送信メール要否のセット
	 * 
	 * @param dontSendMail 送信メール要否
	 */
	public void setDontSendMail(boolean dontSendMail)
	{
		m_dontSendMail = dontSendMail;
	}
//===========================================================================
// Public Methods
//===========================================================================
	/**
	* リセット
	*
	* @param mapping The mapping used to select this instance
	* @param request The servlet request we are processing
	*/
	public void reset(ActionMapping mapping, HttpServletRequest request) {
		
		//debug
		log.debug("reset");
		//encodeing セット
		try {
			request.setCharacterEncoding("SJIS");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		m_action = null;
		m_bno = 0;
		m_addText = null;
		m_resolution = null;
		m_scid = null;
		m_releaseSchDate = null;
		m_releaseSchDateString = null;
		m_errorType = null;
		m_errorCause = null;
		m_errorPoint = null;
		m_trainPno = null;
		m_shouldFindPno = null;
		m_errorDelayReason = null;
		m_submitType = DEFAULT_STATUS;
		m_requestStatusWhitebord = null;
		m_requestStatus = null;
		m_requestUpdater = null;
		m_requestAnalyst = null;
		m_requestAssigne = null;
		m_requestCpid = null;
		m_delDepends = null;
		m_delDependBno = null;
		m_addDepends = null;
		m_addDependBno = null;
		m_dontSendMail = false;
	}
	/**
	* 値の検証(Validate) 
	*
	* @param mapping The mapping used to select this instance
	* @param request The servlet request we are processing
	*/
	public ActionErrors validate(ActionMapping mapping,
								 HttpServletRequest request) {
		ActionErrors errors = new ActionErrors();
		
		log.debug("validate");
		
		//action
		Varidater.checkRequired(m_action, "action", errors);
		//releaseSchDate
		if (Varidater.isInput(m_releaseSchDateString)) {
			if (Varidater.checkDate(m_releaseSchDateString, "releaseSchDate", RELSCH_DATE_FORMAT, errors)) {
				//このタイミングで提供予定日をセットする
				/* MMDDパターンを適用すると年が1970年と解釈されてしまうので
				 * ここで強制的に現在日付とマージする。
				 */
				Date issuDate = Varidater.parseDate(m_releaseSchDateString, RELSCH_DATE_FORMAT);
				Calendar now = Calendar.getInstance();	//現在日付
				Calendar issuCal = Calendar.getInstance();
				issuCal.setTime(issuDate);				//発行日カレンダ
				issuCal.set(Calendar.YEAR, now.get(Calendar.YEAR));
				
				m_releaseSchDate = issuCal.getTime();
			}
		}
		
		
		//submitType
		if (Varidater.checkSelected(m_submitType, "submitType", errors)) {
			//タイプ別必須チェック
			if (m_submitType.equals("statusSelect")) {
				//issuDate
				Varidater.checkSelected(m_requestStatus, "requestStatus", errors);
			} else if (m_submitType.equals("statusDispatch")) {
				//requestAssigne
				Varidater.checkSelected(new Integer(m_requestAssigne), "requestAssigne", errors);
			}
		}
		return errors;
	}
}