/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//コース管理一覧画面作成用クラス
//
//変更履歴
//2005.02.18  新規作成  森　智志
//
//機能
//
//OLMSカスタマイズに伴うコース管理一覧画面の作成
//
/////////////////////////////////////////////////////////////////
package jp.co.ntt.lms.xmf.actions.xmo.LoLog;

import java.util.List;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import jp.co.ntt.lms.lo.Course.Touchable.TouchableLoEnv;
import jp.co.ntt.lms.lo.lom.learnableinfo.LoInfo;
import jp.co.ntt.lms.lo.lom.learnableinfo.LoInfoFactory;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.Lo.LoExtend.LoExtendTable;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.util.HtmlEscape;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;


/**
 * OLMSカスタマイズに伴うコース管理一覧画面を作成します。
 * @author s-mori
 * @version 1.0
 */
public class LoLogCourseManageLoListAction extends Action {

	
	
	// TODO
	private final String STR_ERRMSG_LOID     = "LOIDの取得に失敗しました。";	
	private final String STR_STATUS_1 = "学習中";
	private final String STR_STATUS_2 = "学習済";
	private final String STR_STATUS_TOUCHABLE = "申請可能";
	private final String STR_STATUS_NOSTUDY = "未学習";
	private final String STR_STATUS_NOASSIGN = "アサイン";
	private final String STR_STATUS_APPLIED = "申請済み";
	private final String STR_BUTTON_DETAILS = "詳細表示";

	private final String STR_TITLE_FINISHLIST = "コース管理一覧画面";
	private final String STR_ATTENDAPPLY_MAIL = "承認依頼メールを送信します。\\nよろしいですか？";
	private final String STR_BUYAPPLY_MAIL = "購入依頼メールを送信します。\\nよろしいですか？";
	private final String STR_USERNAME_ITEM = "受講者名";
	private final String STR_LOTITLE_ITEM = "ＬＯタイトル";
	private final String STR_LOEXPLANATION_ITEM = "概要";
	private final String STR_SITUATION_ITEM = "学習状況";
	
	private final String STR_ERRMSG_COURSEMANAGE = "コース管理LO一覧画面の取得に失敗しました。";
	

	/**
	 * コース管理一覧画面の作成に伴うstrutsアクションをキックします。
	 * @param mapping マッピング
	 * @param form アクションフォーム
	 * @param request HTTPリクエスト
	 * @param response HTTPレスポンス
	 * @return 処理結果に応じたmappingオブジェクト
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {

		// キャッシュ無効処理
		response.setHeader("cache-control", "no-cache");

		HttpSession session = request.getSession();
		
		//ユーザーID取得
		String strUserID_o = "";
		String strLoginUserID_o = (String)session.getAttribute("userId");	// ログインユーザID
		String strMessage = request.getParameter("message");
		if( strMessage != null ) {
			// Unicode → Shift_JIS変換
			strMessage = new String( strMessage.getBytes("8859_1"), "UTF-8" );
			strMessage = java.net.URLDecoder.decode(strMessage,"UTF-8");
		}
		
		
		//ユーザー管理対象者チェック
		/*
		int ChkUser = 0;	//ユーザー管理者チェックフラグ
		RolesClient objRoCl = null;
		try {
			objRoCl = new RolesClient();
			ChkUser = objRoCl.chkUserFunction(strLoginUserID_o, "1");
		} catch (Exception e) {
			//あっては困る状態なので、システム例外を投げる
		throw new XmsSystemException(e);
		}
		*/
		int ChkUser = (request.getParameter("selectID") == null ? 0 : 1);
				
		//ユーザー管理者の場合
		if(ChkUser==1){
			// 選択したLOIDを取得する
			strUserID_o = request.getParameter("selectID");	// 選択されたユーザーID
			/*
			if(strUserID_o == null)
			{
				request.setAttribute("message", STR_ERRMSG_LOID);
				request.setAttribute("close", "1");
				return mapping.findForward("error");
			}
			*/
		//管理者以外の場合
		} else {
			strUserID_o = strLoginUserID_o;
		}
		
		//ユーザー名取得
		PeopleClient objPeople = new PeopleClient();
		String strLoginUserName_o = "";
		// Peopleクライアントのパラメータクリア
		objPeople.clear();
		objPeople.setWhereUserID( strUserID_o );
		if( !objPeople.select() ) {
		}
		if( objPeople.next() ) {
			strLoginUserName_o = objPeople.getUserName();	// ユーザー名
		}

		// 学習可能なLoInfoのリストを取得
		LoInfoFactory factory = new LoInfoFactory();
		List loInfoList = factory.getLearnableLoInfoList(strUserID_o);
		
		// iniファイル読込
		TouchableLoEnv touchEnv = new TouchableLoEnv();
		String strAssignRpURL = touchEnv.getLO_assign_rq_mail_url();
		
		
		// LOClientの作成
		LoClient objLo = new LoClient();

		// ●HTMLブロック2  一覧表の各行
		StringBuffer bufTable = new StringBuffer("");
		
		for(int j = 0; j < loInfoList.size(); j++)
		{
			// LOInfo を取得
			LoInfo loInfo = (LoInfo)loInfoList.get(j);

			// LOID を取得
			String strLoId = loInfo.getLoData().getLoID();


			// LO情報のうち、履修状況を取得します。
			objLo.setWhereLoID(strLoId);
			if(!objLo.select()){
				// エラーの場合
				request.setAttribute("message", STR_ERRMSG_COURSEMANAGE);
				request.setAttribute("close", "1");
				return mapping.findForward("error");
			}
			
			
			String strLoTytle 	= loInfo.getLoData().getLoTytle();		// LOタイトル
			String strLoExplanation = loInfo.getLoData().getLoexplanation() + "&nbsp;";	// 概要
			String strLoFinish = "";		// 学習状況
			String strLoType = loInfo.getLoData().getLoType();		// LOタイプ
			boolean isBuy = (loInfo.getLoExtendRecord() != null && loInfo.getLoExtendRecord().getBuy().equals(LoExtendTable.LOEXTEND_REQUIRE_BUY));

			if(objLo.next()){
				//ステータス取得
				if (objLo.checkStatus(strLoId, strUserID_o) == false) {
					//検索失敗
					throw new Exception("checkStatus Method of LoClient Class returned false.");
				}
				//学習状況設定
				switch( objLo.getStatus() ) {
					case 2:
							strLoFinish = STR_STATUS_1;
							break;
					case 3:
					case 4:
					case 5:
							strLoFinish = STR_STATUS_2;
							break;
					case 1:
							// 未学習・申請中・申請可能を振り分け
							AssignmentsClient asClient = new AssignmentsClient();
							asClient.setCondition("trim(membershipid) like '%" + StringEscapeUtils.escapeSql(strUserID_o) + "' and trim(materialid) = '" + StringEscapeUtils.escapeSql(loInfo.getRelationData().getMaterialID()) + "'");
							if(!asClient.select()){
								// アサイン情報がとれない場合
								strLoFinish = STR_STATUS_TOUCHABLE;
							}else if(asClient.next()){
								// アサインされている場合
								strLoFinish = STR_STATUS_NOSTUDY;
							}else{
								// アサインされていない場合、管理者なら「未アサイン」
								if(ChkUser == 1){
									strLoFinish = STR_STATUS_NOASSIGN;
								}else{
									// アサインされていない場合は、cookieを見る
									Cookie[] cookies = request.getCookies();
									// クッキーが未設定の場合
									if( cookies == null ) {
										strLoFinish = STR_STATUS_TOUCHABLE;
									}
									else {
										boolean isExistCookie = false;						//クッキーフラグ
										String strCookieName = strLoId + strUserID_o;		//クッキー名称
										for( int c = 0; c < cookies.length; c++ )
										{
											Cookie cookie = cookies[c];
											// クッキーを取得し、"LOID+USERID"のクッキー名称が存在するかチェックする。
											if ( cookie.getName().equals( strCookieName ) )
											{
												isExistCookie = true;
												break;
											}
										}
				
										// クッキーが存在する場合
										if ( isExistCookie ){
											strLoFinish = STR_STATUS_APPLIED;
										}
										// クッキーが存在しない場合
										else{
											strLoFinish = STR_STATUS_TOUCHABLE;
										}
									}
								}
							}
							
							asClient.clear();

					default:
							break;
				}
				
			}
			objLo.clear();

			
			bufTable.append("<TABLE border=\"1\">\n");


	
			bufTable.append("<TR>\n");
			bufTable.append("<TD style=\"height:8px;width:120px\">\n");
			bufTable.append(HtmlEscape.escape(strLoTytle) + "\n");
			bufTable.append("</TD>\n");
			bufTable.append("<TD style=\"height:8px;width:120px\">\n");
			bufTable.append(strLoExplanation + "\n");
			bufTable.append("</TD>\n");
			bufTable.append("<TD style=\"height:8px;width:80px\">\n");
			bufTable.append(HtmlEscape.escape(strLoFinish) + "\n");
			if(ChkUser != 1 && strLoFinish.equals(STR_STATUS_TOUCHABLE)){
				bufTable.append("<br><a href=\"javascript:" + (isBuy ? "BuyApply" : "AttendApply") + "('" + strLoId + "');\">" + (isBuy ? "購入申請" : "学習申請") + "</a>\n");
			}
			bufTable.append("</TD>\n");
			bufTable.append("<TD style=\"height:8px;width:80px\" align=\"center\">\n");
			bufTable.append("<INPUT type=\"button\" name=\"Detail\" value=\"" + STR_BUTTON_DETAILS + "\" onclick=\"detailDisplay('" + strLoId + "')\">\n");
			bufTable.append("</TD>\n");
			bufTable.append("</TR>\n");
			bufTable.append("</TABLE>\n");
		}

		
		
		// ●HTMLブロック1(JS内、strMessageが渡された場合のJS処理
		StringBuffer bufJs = new StringBuffer("");
		if(strMessage != null){
			bufJs.append("alert( \"" + strMessage + "\" )\n");
			bufJs.append("var strReplaceURL = window.location.href;\n");
			bufJs.append("strReplaceURL = strReplaceURL.substring(0,strReplaceURL.indexOf(\"message\")-1);\n");
			bufJs.append("window.location.replace(strReplaceURL);\n");
		}

		// 作成した値を格納
		request.setAttribute("bufJs", bufJs.toString());
		request.setAttribute("bufTable", bufTable.toString());
		request.setAttribute("strAssignRpURL", strAssignRpURL);
		request.setAttribute("strLoginUserName_o", HtmlEscape.escape(strLoginUserName_o));
		request.setAttribute("LoExtendTable_LOEXTEND_NOREQUIRE_BUY", LoExtendTable.LOEXTEND_NOREQUIRE_BUY);
		request.setAttribute("LoExtendTable_LOEXTEND_REQUIRE_BUY", LoExtendTable.LOEXTEND_REQUIRE_BUY);
		
		request.setAttribute("STR_TITLE_FINISHLIST", STR_TITLE_FINISHLIST);
		request.setAttribute("STR_ATTENDAPPLY_MAIL", STR_ATTENDAPPLY_MAIL);
		request.setAttribute("STR_BUYAPPLY_MAIL", STR_BUYAPPLY_MAIL);
		request.setAttribute("STR_USERNAME_ITEM", STR_USERNAME_ITEM);
		request.setAttribute("STR_LOTITLE_ITEM", STR_LOTITLE_ITEM);
		request.setAttribute("STR_LOEXPLANATION_ITEM", STR_LOEXPLANATION_ITEM);
		request.setAttribute("STR_SITUATION_ITEM", STR_SITUATION_ITEM);
		
		return mapping.findForward("success");

	}
	
}
