/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//演習回答状況（ユーザー指定）
//
//		変更履歴
//			2005.01.31  新規作成  OGA
//
//	機能
//
//この画面は演習回答状況画面（ユーザー指定）を表示します
//
/////////////////////////////////////////////////////////////////

/*
 * 作成日: 2005/02/20
 *
 * TODO この生成されたファイルのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
package jp.co.ntt.lms.xmf.actions.lo.wbt.IndividualLog;

import java.util.Vector;

import jp.co.ntt.lms.xmf.actions.lo.wbt.IndividualLog.inc.*;
import jp.co.ntt.lms.lo.WBT.IndividualLog.*;
import jp.co.ntt.lms.Common.RDF.*;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.util.*;
import jp.co.ntt.lms.xmo.Lo.LoClient;

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


import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * @author Administrator
 *
 * TODO この生成された型コメントのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
public class UserReplyStatusAction  extends Action {
	private IndividualLogMessga_inc IndividualLogMessga_inc = new IndividualLogMessga_inc();
	private IndividualLogCommon_inc IndividualLogCommon_inc = new IndividualLogCommon_inc();
	private IndividualStub_inc IndividualStub_inc = new IndividualStub_inc();
	private IndividualLogComFunc_inc IndividualLogComFunc_inc = new IndividualLogComFunc_inc();

	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		///////////////////////////////////////////
		// パラメータ取得
		// 	・LoID		LoID		// 必須
		// 	・userId	ユーザーID	// 必須
		// 	・LoType	Loタイプ	// 必須
		// 	・UID		UID			// 必須
		///////////////////////////////////////////
		String strLoID_o         = request.getParameter( IndividualLogCommon_inc.STR_LOID_o );          // LoID
		String strUserID_o       = request.getParameter( IndividualLogCommon_inc.STR_USERID_o );        // ユーザーID
		String strLoType_o       = request.getParameter( IndividualLogCommon_inc.STR_LOTYPE_o );        // Loタイプ
		String strUID_o          = request.getParameter( IndividualLogCommon_inc.STR_UID_o );           // UID

		// RealLOID取得
		///////////////////////////////////////////

		///////////////////////////////////////////
		// パラメータチェック
		///////////////////////////////////////////
		
		// LoIDの入力チェック
		if( strLoID_o == null || strLoID_o.equals( "" ) ) {
			request.setAttribute("message", IndividualLogMessga_inc.M072001);
			request.setAttribute("detail", IndividualLogMessga_inc.D072001);
			request.setAttribute("close", "on");

			return mapping.findForward("error");
		}
		// ユーザーIDの入力チェック
		if( strUserID_o == null || strUserID_o.equals( "" ) ) {
			request.setAttribute("message", IndividualLogMessga_inc.M072002);
			request.setAttribute("detail", IndividualLogMessga_inc.D072002);
			request.setAttribute("close", "on");

			return mapping.findForward("error");
		}
		// Loタイプの入力チェック
		if( strLoType_o == null || strLoType_o.equals( "" ) ) {
			request.setAttribute("message", IndividualLogMessga_inc.M072003);
			request.setAttribute("detail", IndividualLogMessga_inc.D072003);
			request.setAttribute("close", "on");

			return mapping.findForward("error");
		}
		// UIDの入力チェック
		if( strUID_o == null || strUID_o.equals( "" ) ) {
			request.setAttribute("message", IndividualLogMessga_inc.M072004);
			request.setAttribute("detail", IndividualLogMessga_inc.D072004);
			request.setAttribute("close", "on");

			return mapping.findForward("error");
		}
		///////////////////////////////////////////
		// RDFNodeの取得
		// ・strUID_o	UID			必須
		///////////////////////////////////////////
		RDFNode objNode = (RDFNode)IndividualStub_inc.getTargetRDFNode( strUID_o , strLoID_o , request.getSession() );
		if( objNode == null ){
			request.setAttribute("message", IndividualLogCommon_inc.MSG_MAKE_STOREDATA_o);
			request.setAttribute("detail", "");
			request.setAttribute("close", "on");

			return mapping.findForward("error");
		}

		////////////////////////
		// データの取得
		////////////////////////
		IndividualLogReplyStatusStoreData objStoreData = new IndividualLogReplyStatusStoreData( strLoID_o, strUserID_o, strLoType_o , objNode);

		if( objStoreData.makeStoreData() != true ){
			request.setAttribute("message", IndividualLogCommon_inc.MSG_MAKE_STOREDATA_o);
			request.setAttribute("detail", "");
			request.setAttribute("close", "on");

			return mapping.findForward("error");
		}

		// データがない場合
		if( objStoreData.getMaxData() == 0 ){
			request.setAttribute("message", IndividualLogCommon_inc.MSG_DATA_ZERO_o);
			request.setAttribute("detail", "");
			request.setAttribute("close", "on");

			return mapping.findForward("error");
		}

		Vector vecStoreData = objStoreData.getStoreData(0);

		// 問題数(AU単位に異なる)
		int	intCol;
		intCol = objStoreData.getInteractionIDMAX( (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_AU_ID_o ) );

		// 最大カラム数を計算する ■
		int MaxColumn = 5 + intCol * 2;

		/////////////////////////////////////////////
		// 学習者とセッション日時にて表をまとめる
		/////////////////////////////////////////////

		// AU_ID取得
		String	strAU	= " ";
		// 学習者名取得
		String	strSTUDENT	= " ";
		// セッション日付取得
		String	strSESSIONT_ID	= (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_SESSION_ID_o ) ;

		// AU 単位にInteraction_IDと正解を取得する
		// ROWSPANを求める
		// カウンタ
		int count1[], count2[], count3[];
		count1 = new int[ objStoreData.getMaxData() ];
		count2 = new int[ objStoreData.getMaxData() ];
		count3 = new int[ objStoreData.getMaxData() ];
		int	intNum1, intNum2;
		int	intMaxQuestion = 0;
		intMaxQuestion = objStoreData.getInteractionIDMAX( (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_AU_ID_o ) );

		Vector	vecCorrectResponse;
		Vector	vecQuestion;

		// 学習者とセッション日付をセット
		count1[0] = 1;	// 学習者同一
		count2[0] = 1;	// セッション日時同一
		count3[0] = 1;	// 回答回数
		intNum1 = 1;
		intNum2 = 1;

		int	intWork;
		float fltWork;
		// 正解欄用Decimalフラグ
		int intDecimalFlg[];
		intDecimalFlg = new int[ intMaxQuestion ];

		// 同一学習者と同一セッション日付をカウントする
		for(int i=0; i<objStoreData.getMaxData(); i++){

			// 要素を取得
			vecStoreData = (Vector)objStoreData.getStoreData( i );
			// 表のなかで、最大問題個数を取得
			intCol = objStoreData.getInteractionIDMAX( (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_AU_ID_o ) );
			if( intCol > intMaxQuestion ){
				 intMaxQuestion = intCol;
			}

			// 前回のAUと一致しなかった場合
			if( !(strAU.equals((String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_AU_ID_o ))) ){
				// 異なるAUではROWSPANを計算しないため、リセットする
				count1[ i ] = 1;
				intNum1 = i;
				count2[ i ] = 1;
				intNum2 = i;
				count3[ i ] = 1;
				// 保存AU名を変更する
				strAU = (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_AU_ID_o );
				strSTUDENT = (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_STUDY_NAME_o );
				strSESSIONT_ID = (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_SESSION_ID_o );
				continue;
			}

			// 前回の学習者と一致する場合
			if( strSTUDENT.equals((String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_STUDY_NAME_o )) ){
				// ROWSPANの数値を加算する。
				count1[ intNum1 ] = count1[ intNum1 ] + 1;
				count1[ i ] = 0;

				// 前回のセッション日付と一致する場合
				if( strSESSIONT_ID.equals((String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_SESSION_ID_o )) ){
					count2[ intNum2 ] = count2[ intNum2 ] + 1;
					count2[ i ] = 0;
					count3[ i ] = count3[ i - 1 ]  + 1;
				}
				else{
					// 前回のセッション日付と一致しない場合
					count2[ i ] = 1;
					intNum2 = i;
					count3[ i ] = 1;
					strSESSIONT_ID = (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_SESSION_ID_o );
				}
			}
			else{
				// 前回の学習者と一致しない場合
				count1[ i ] = 1;
				count2[ i ] = 1;
				count3[ i ] = 1;
				intNum1 = i;
				intNum2 = i;
				strSTUDENT = (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_STUDY_NAME_o );
			}

		}


		// 最大問題数
		String	strInterID[];
		String	strCoreect[];
		strInterID = new String[ intMaxQuestion ];
		strCoreect = new String[ intMaxQuestion ];


		// ストアーデータ１件目に戻す
		vecStoreData = (Vector)objStoreData.getStoreData( 0 );

		// １件目AU取得
		strAU	= (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_AU_ID_o ) ;

		// １件目Interraction名取得
		intCol = objStoreData.getInteractionIDMAX( (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_AU_ID_o ) );
		for( int j=0; j<intCol; j++){
			// Interraction名表示
			vecCorrectResponse = objStoreData.getCorrectResponse( (String)vecStoreData.get( IndividualLogCommon_inc.DEF_GR_AU_ID_o ) );

			// 問題数分
			// Vectorを取り出す
			vecQuestion = (Vector)vecCorrectResponse.get( j );
			strInterID[ j ] = (String)vecQuestion.get( IndividualLogCommon_inc.DEF_GR_INTERACTION_ID );
			strCoreect[ j ] = (String)vecQuestion.get( IndividualLogCommon_inc.DEF_GR_CORRECT_RESPONSE );

		}


		int intCorrect[], intQuestion = 0;
		intCorrect = new int[ intMaxQuestion ];
		float fltRound ;

		request
		.setAttribute("IndividualLogCommon_inc",
				IndividualLogCommon_inc);
		request.setAttribute("objStoreData", objStoreData);
		request.setAttribute("strAU", strAU);
		request.setAttribute("intCol", new Integer(intCol));
		request.setAttribute("strCoreect", strCoreect);
		request.setAttribute("intDecimalFlg", intDecimalFlg);
		request.setAttribute("intCorrect", intCorrect);
		request.setAttribute("strInterID", strInterID);
		request.setAttribute("count1", count1);
		request.setAttribute("count2", count2);
		request.setAttribute("count3", count3);
		
		request.setAttribute("intMaxQuestion", new Integer(intMaxQuestion));
		request.setAttribute("intQuestion", new Integer(intQuestion));

		return mapping.findForward("success");
	}
}
