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

//===========================================================================
// import
//===========================================================================
import java.io.IOException;
import java.util.Locale;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.logging.*;
import org.apache.struts.action.*;
import org.apache.struts.util.*;
import org.apache.commons.beanutils.*;

import java.util.*;
import jp.gr.java_conf.bugslife.selections.*;
import jp.gr.java_conf.bugslife.user.*;
import jp.gr.java_conf.bugslife.bug.*;
import jp.gr.java_conf.bugslife.db.*;
import jp.gr.java_conf.bugslife.form.*;
import jp.gr.java_conf.bugslife.system.*;
import jp.gr.java_conf.bugslife.util.Converter;
import jp.gr.java_conf.bugslife.util.Assert;
import jp.gr.java_conf.bugslife.util.Varidater;
/**
 *<PRE>
 * 
 * BugDetail1Actionクラス
 *
 *</PRE>
 * @version	0.0
 * @author	鰐川 正寛
 */
public final class BugDetail1Action extends BaseAction 
{
//===========================================================================
// attributes
//===========================================================================
	/**
	 * Form
	 */
	BugDetail1Form m_form;
	/**
	 * session
	 */
	HttpSession m_session;
	/**
	 * Bug
	 */
	Bug m_bug = null;
	/**
	 * Bug
	 */
	UserInfo m_logonUser;
	/**
	 * Log
	 */
	private Log log = LogFactory.getLog(this.getClass().getName());
	/**
	 * to
	 */
	private int m_toUno;
//===========================================================================
// methods
//===========================================================================
	/**
	 * exevute
	 *
	 * @param mapping The ActionMapping used to select this instance
	 * @param actionForm The optional ActionForm bean for this request (if any)
	 * @param request The HTTP request we are processing
	 * @param response The HTTP response we are creating
	 *
	 * @exception Exception if business logic throws an exception
	 */
	public synchronized ActionForward doAction(ActionMapping mapping,
				 ActionForm form,
				 HttpServletRequest request,
				 HttpServletResponse response)
				throws Exception {
		
		ActionForward forward = null;
		/*
		 * 初期処理
		 */
		m_form = (BugDetail1Form)form;	//formの取得
		m_session = getSession(request);//sessioの取得
		m_logonUser = (UserInfo)getAttribute(m_session,"UserInfo");	//ログインユーザの取得
		m_bug = (Bug)m_session.getAttribute("bug");	//バグの取得
		
		String action = m_form.getAction();
		//debug
		log.debug(	"action =" + action + 
					" submiteType = " + m_form.getSubmitType() +
					" bno = " + m_form.getBno() +
					" bno(s) = " + (m_bug == null ? "null" : ""+m_bug.getBno()));
		
		//新規の場合
		if (action.equals("new")) {
			
			//新規インスタンスの生成
			m_bug = new Bug();
			//バグインスタンスのセット
			m_session.setAttribute("bug", m_bug);
			
			//カレント情報のセット
			/*
			 * 入力情報セット
			 */
			//システム情報の取得
			Sysconf sysconf = (Sysconf)m_session.getAttribute("sysconf");
			
			m_form.setIssuPno(sysconf.getCurrentPno());
			m_form.setAppVersion(sysconf.getCurrentAppver());
			m_form.setDbVersion(sysconf.getCurrentDbver());
			m_form.setHtmlVersion(sysconf.getCurrentHtmlver());
			m_form.setSpecVersion(sysconf.getCurrentSpecver());
			
			//add wani 07/10/23
			String pno = m_logonUser.getDefPno();
			if (pno != null) {
				m_form.setIssuPno(pno);
			}
			m_form.setLocation(m_logonUser.getDefLocation());
			m_form.setSubsystem(m_logonUser.getDefSubsystem());
			m_form.setFunctionName(m_logonUser.getDefFunctionName());
			
			
			Date date = new Date();
			m_form.setIssuDate(date);
			m_form.setIssuDateString(Converter.getDateString(date, BugDetail1Form.ISSU_DATE));
			
			//showへ遷移
			forward = mapping.findForward("show");
			
		//表示の場合
		} else if (action.equals("show")){
			
			//=========================
			//bugインスタンスの取得判定
			//=========================
			//セッションに無いかbnoが違う場合
			if ((m_bug == null) || (m_bug.getBno() != m_form.getBno())) {
				//バグインスタンスの取得
				m_bug = new Bug(m_form.getBno());
				//バグインスタンスのセット
				m_session.setAttribute("bug", m_bug);
			
			//そのバグが更新されていた場合
			} else {
				if (m_bug.isChanged()){
					//debug
					log.debug("is changed!");
					
					//バグインスタンスの取得
					m_bug = new Bug(m_form.getBno());
					//バグインスタンスのセット
					m_session.setAttribute("bug", m_bug);
				}
			}
			//入力情報セット
			PropertyUtils.copyProperties(m_form, m_bug);
			
			//showへ遷移
			forward = mapping.findForward("show");
			
		//更新の場合
		} else {
			
			//=========================
			//bugインスタンスの取得判定
			//=========================
			if ((m_bug == null) || (m_bug.getBno() != m_form.getBno())) {
				//警告！
				log.warn("unmatch bno ");
				//バグインスタンスの取得
				m_bug = new Bug(m_form.getBno());
				//バグインスタンスの再セット
				m_session.setAttribute("bug", m_bug);
			}
			
			m_form.setBno(m_bug.getBno());
			//チェック
			ActionErrors errors = m_form.validate(mapping, request);
			if (!errors.empty()) {
				 saveErrors(request, errors);
				return (new ActionForward(mapping.getInput()));
			}
			
			//新規
			if (m_bug.getBno() == 0) {
				
				//差分取得開始
				m_bug.startActivity();
				
				//======================
				// 追加処理
				//======================
				//入力情報セット
				PropertyUtils.copyProperties(m_bug, m_form);
				
				//登録日、登録者のセット
				m_bug.setRegistDate(new Date());
				m_bug.setIssuer(m_logonUser.getUno());
				updateStatus();							//ステータスの更新
				
				//DBの追加
				m_bug.insert(m_logonUser.getUno());		//bnoが確定
				
				//======================
				// 更新処理
				//======================
				// 一度インサートしないと故障番号がとれないため、
				// インサート後に故障IDを生成してUPDATEする。
				// 故障番号確定後、故障ＩＤを生成し、UPDATEする。
				//システム情報の取得
				Sysconf sysconf = (Sysconf)m_session.getAttribute("sysconf");
				m_bug.makeBid(sysconf.getSysid());		//発行ＩＤの生成
				m_bug.setInputType(Bug.ITYPE_DETAIL0);	//入力情報タイプのセット
				
				//故障内容の追加
				m_bug.addText(m_form.getTroubleSituation(), m_logonUser);
				//差分の取得終了
				m_bug.endActivity();
				
				//差分を取ってくる
				Activitys act = m_bug.getActivitys();
				//メール送信不要でなければ
				if (! m_form.getDontSendMail()) {
					//メール送信
					act.sendMail(m_logonUser, request);
				}
				//履歴の出力
				act.addActivity(m_logonUser);
				
				m_bug.update(m_logonUser.getUno(), false);		//更新
				
				//バグインスタンスのセット
				m_session.setAttribute("bug", m_bug);
				
			//更新
			} else {
				
				try {
					
					//差分取得開始
					m_bug.startActivity();
					
					//入力情報セット
					PropertyUtils.copyProperties(m_bug, m_form);
					//入力情報タイプのセット
					m_bug.setInputType(Bug.ITYPE_DETAIL1);	
					//ステータスの更新
					updateStatus();	
					//排他チェックも兼ねてまず更新する。
					m_bug.update(m_logonUser.getUno());		//更新
					
					//故障内容の追加
					m_bug.addText(m_form.getTroubleSituation(), m_logonUser);
					
					//差分の取得終了
					m_bug.endActivity();
					
					//差分を取ってくる
					Activitys act = m_bug.getActivitys();
					//メール送信不要でなければ
					if (! m_form.getDontSendMail()) {
						//メール送信
						act.sendMail(m_logonUser, request);
					}
					//履歴の出力
					act.addActivity(m_logonUser);
					
					//直前でUPDATEをしているために更新内容が変わらない場合、
					//setPersistDateでのユニーク化も聞かず、排他制御エラーとなる
					//そのうちJDBCドライバを変えて実験するが、とりあえず排他チェックを
					//はずして更新する。
					
					m_bug.update(m_logonUser.getUno(), false);		//排他制御なしの更新
				//排他例外
				} catch (ExclusionException ee) {
					//debug
					log.debug("ExclusionException", ee);
					
					Varidater.addErrors("exp.exclusion", "bug", errors);
					saveErrors(request, errors);
					return (new ActionForward(mapping.getInput()));
					
				}
				
			}
			
			//successへ遷移
			forward = mapping.findForward("success");
			
		}
		
		// Forward control to the specified success URI
		return forward;
	}
	/**
	 * ステータスの変更
	 */
	private void updateStatus() {
		
		String submitType = m_form.getSubmitType();
		
		//log
		log.debug("submiteType = " + submitType);
		log.debug("auter = " + m_form.getRequestAuther() +
				  " analyst = " + m_form.getRequestAnalyst()
		);
		
		//障害申告
		if (submitType.equals("newAuther")) {
			int auther = Integer.parseInt(m_form.getRequestAuther());
			
			m_bug.setRegistDate(new Date());
			m_bug.setIssuer(m_logonUser.getUno());
			m_bug.setAuther(auther);
			
			m_bug.setStatus(Bug.STS_NEW);
			
			//
			m_bug.setDispatch();		//ディスパッチ先を決定
			
		//障害申告
		} else if (submitType.equals("new")) {
			m_bug.setRegistDate(new Date());
			m_bug.setIssuer(m_logonUser.getUno());
			m_bug.setStatus(Bug.STS_NEW);
			
			//
			m_bug.setDispatch();		//ディスパッチ先を決定
			
		//解析者指定
		} else if (submitType.equals("analize")) {
			m_bug.setRegistDate(new Date());
			m_bug.setIssuer(m_logonUser.getUno());
			
			int analyst = Integer.parseInt(m_form.getRequestAnalyst());
			m_bug.setAnalyst(analyst);
			m_bug.setStatus(Bug.STS_INVESTIGATION);
			//
			m_bug.setDispatch();		//ディスパッチ先を決定
			
		//未確認
		} else if (submitType.equals("unconfirmed")) {
			m_bug.setRegistDate(new Date());
			m_bug.setStatus(Bug.STS_UNCONFIRMED);
			//
			m_bug.setDispatch();		//ディスパッチ先を決定
			
		//申告
		} else if (submitType.equals("same")) {
			//なにもしない
			//
			m_bug.setDispatch();		//ディスパッチ先を決定
			
		//ステータス状況変更
		} else if (submitType.equals("statusWhitebord")) {
			m_bug.setStatusWhitebord(m_form.getRequestStatusWhitebord());
			//
			m_bug.setDispatch();		//ディスパッチ先を決定
			
		} else {
			//ここには来ないはず
			Assert.check(false, "invalid submitType type = " + submitType);
			
		}
	}
}
