/*
̃t@C̒ǵANTT I[v\[XCZX@o[W 1.0iu{
_vƂj̓Kp󂯂܂B
{_炵ȂÃt@CgpĂ͂Ȃ܂B
{_̃Rs[́Âtqkł܂B
yzzTCgURLz http://www.oss.ecl.ntt.co.jp/lms/

{_ɊÂЕz\tgEFÁÂ܂܁Âَ͖
ނ̕ۏ؂ȂŁAЕz܂B{_ɊÂyѐ𗥂
̕ɂẮA{_QƂĂB

uIWiR[hv́A NTT Cyber Space Laboratories Code łB 
uIWiR[hv́uJҁv́A{dMdbЂłB  
{dMdbЂɂn삳ꂽ́ACopyright (C) 2004 
{dMdb łB
SĂ̌ۂ܂B 
uRgr[^vF_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
yzzTCgURLz http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
//	Offline i󋵈ꗗO[vf[^XgANX
//			ύX
//				2004.01.08	VK쐬	꓇@pK
//
package jp.co.ntt.lms.lo.Offline.IndividualLog;

// Java API
import java.text.DecimalFormat;
import java.util.Vector;

import jp.co.ntt.lms.Common.RDF.RDFNode;

/**
 * i󋵈ꗗO[ṽf[^XgA<BR>
 * 
 * @author H.Takishima
 * @version 2.0.4.0.0 2004.01.08
 */
public class IndividualLogGroupProgressStatusStoreData extends IndividualLogStoreData {

	/** LOID */
	private String mstrLOID;
	
	/** UserID */
	private String mstrUserID;
	
	/** LoType */
	private String mstrLoType;
	
	/** ލ\ */
	private RDFNode mobjNode;

	/**@SQL擾f[^i[̈@*/
	private String mstrWrkData[ ][ ];

	/** SQL擾f[^i[̈([U[擾j*/
	private String mstrWrkDataUser[ ][ ];

	/** i󋵈ꗗO[vf[^iS+Userf[^j*/
	private Vector mvecStoreDataUser;
	
	/** i󋵈ꗗO[vf[^iSj*/
	private Vector mvecStoreData;
	
	/**
	 * RXgN^
	 * @param LOID
	 * @param UserID
	 * @param LoType
	 * @param objNode
	 **/
	public IndividualLogGroupProgressStatusStoreData(String strLOID,String strUserID,String strLoType,RDFNode objNode ) {
		this.mstrLOID = strLOID;
		this.mstrUserID = strUserID;
		this.mstrLoType = strLoType;
		this.mobjNode = objNode;
		//XgAf[^
		mvecStoreData = new Vector();
		mvecStoreDataUser = new Vector();

	}

	/**
	 * i󋵈ꗗO[vf[^IuWFNg쐬
	 * @return Aُ
	 **/
	public boolean makeStoreData() {
	
		try{
			//SQL𔭍săe[uf[^擾(RecordSet)
			makeResultSql();
			
			//f[^݂ꍇ
			if(mstrWrkDataUser != null){
				//RecordSetf[^Obj
				setStoreData();

				//wKґSĂUserIdŃXgAf[^𐶐
				setStoreDataUserAll();

				//IndividualLogStoreDataɍ쐬ꗗ\ObjZbg
				setStoreDataObj(mvecStoreDataUser);

			}
			return true;

		}catch(Exception e){
			return false;
		}
	}

	/**
	 * SQL𔭍sADBf[^擾
	 **/
	private void makeResultSql() throws Exception{
	
		Vector vecParam = new Vector();		//i[̈

		// ALOID擾B
		String strRealLoID = new IndividualLogStoreData().getRealLoID(mstrLOID);

		//SQL쐬
		//Zbg
		vecParam.addElement(strRealLoID);
		vecParam.addElement(mstrUserID);

		//SQLs
		mstrWrkData = execute( mstrLoType, SQLID_PROGRESS_GROUP,  vecParam);

		Vector vecParamUser = new Vector();		//i[̈
		vecParamUser.addElement(mstrUserID);
		//SQLs
		mstrWrkDataUser = execute( mstrLoType, SQLID_PROGRESS_GET_USER_GROUP,  vecParamUser);

	}

	/**
	 * wKґSĂUserIdŃXgAf[^𐶐
	 */
	private void setStoreDataUserAll(){
		int intRowCnt;									//isj
		String strUserId = new String ();				//UserIDێ
		int intElementNo;								//vfԍ

		//isj
		intRowCnt = mstrWrkDataUser.length;
		//wKҏɃ[v
		for(int i = 0; i < intRowCnt; i++){
			//UserId擾
			strUserId = mstrWrkDataUser[ i ][ G_PROGRESS_USER_REC_USERID_COL ];
			//UserId}b`O
			intElementNo = serchUserId(strUserId);
			if( intElementNo >= 0){
				//}b`ҏWς݂̃f[^i[
				mvecStoreDataUser.addElement((Vector)mvecStoreData.get(intElementNo));
			}else{
				//}b`Ȃ΋f[^i[
				Vector vecEmptyData = new Vector();
				// wKҖ
				vecEmptyData.addElement(mstrWrkDataUser[ i ][ G_PROGRESS_USER_REC_USER_NAME_COL ]);
				// wKJn
				vecEmptyData.addElement("");
				// ŏIANZX
				vecEmptyData.addElement("");
				// ANZX
				vecEmptyData.addElement("");
				// ݐϊwK
				vecEmptyData.addElement("");
				// ŐV_
				vecEmptyData.addElement("");
				// ō_
				vecEmptyData.addElement("");
				// _̖_
				vecEmptyData.addElement("");
				// AU
				vecEmptyData.addElement("");
				// iAU
				vecEmptyData.addElement("");
				// AU
				vecEmptyData.addElement("");
				// USER_ID
				vecEmptyData.addElement(strUserId);

				//XgAf[^Ɋi[
				mvecStoreDataUser.addElement(vecEmptyData);
			}
		}
	}

	/**
	 * XgAf[^UserId
	 * @param String strUserId wUSERID
	 * @return int vfԍ/-1
	 */
	private int serchUserId(String strUserId){
		int intRowCnt;									//isj
		String strTmp = new String();					//e|
		Vector vecData = new Vector();					//[Uf[^

		intRowCnt = mvecStoreData.size();
		for(int i = 0 ; i < intRowCnt ; i++){
			//ҏŴP[Uf[^擾
			vecData = (Vector)mvecStoreData.get(i);
			//UserId擾
			strTmp = (String)vecData.lastElement();
			if(strTmp.equals(strUserId)){
				return i;
			}
		}
		return -1;
	}




	/**
	 * DB擾f[^ҏWA\wKҏɃf[^ObjɊi[
	 */
	private void setStoreData(){
		Vector vecUserList = new Vector();				//wKҒPʂ̃Xg
		int intRowCnt;									//isj
		String strUserId = new String ();				//UserIDێ
		String strUserIdOld = new String();				//OUserIDێ
		String strUID = new String();					//DB擾UID
		String strUIDOld = new String();				//rUID

		//ލ\ꗗ쐬
		createRDFStoreData(mobjNode);

		//isj
		intRowCnt = mstrWrkData.length;

		//wKҏɃ[v
		for(int i = 0; i < intRowCnt; i++){
			//UserId擾
			strUserId = mstrWrkData[ i ][ G_PROGRESS_REC_USERID_COL ];

			//rUserIdi[
			if(i == 0){
				strUserIdOld = strUserId;
			}

			//wKҔr
			if(!strUserId.equals(strUserIdOld)){

				//wKҕAUPʏWv
				Vector vecAuData = setAuStore(vecUserList);

				vecUserList.clear();
				//AUPʂwKҒPʂɏWv
				Vector vecUserData = setUserStore(vecAuData);
				//XgAf[^Ɋi[
				mvecStoreData.addElement(vecUserData);
			}
			strUserIdOld = strUserId;

			//UID擾
			strUID = mstrWrkData[ i ][ G_PROGRESS_REC_UID_COL ];

			//UIDr-ލ\Ɋ܂܂ĂȂΑΏۊO
			if(!strUID.equals(strUIDOld)){
				if(!serchUID(strUID)){
					continue;
				}
			}
			strUIDOld = strUID;

			//wK҂̍sm
			vecUserList.addElement((Vector)storeUserData(i));

		}
		//wKҒPʂ̃XgAcĂΏWv
		if(vecUserList.size() > 0){
			//wKҕAUPʏWv
			Vector vecAuData = setAuStore(vecUserList);
			vecUserList.clear();
			//AUPʂwKҒPʂɏWv
			Vector vecUserData = setUserStore(vecAuData);
			//XgAf[^Ɋi[
			mvecStoreData.addElement(vecUserData);
		}
	}

	/**
	 * ws̃f[^m
	 * @param int intRow wRow
	 * @return Vector wKҏ
	 */
	private Vector storeUserData(int intRow){
		Vector vecRet = new Vector();
		for(int i = 0 ; i < mstrWrkData[ intRow ].length ; i++){
			vecRet.addElement(mstrWrkData[ intRow ][ i ]);
		}
		return vecRet;
	}

	/**
	 * UserPʏWv<BR>
	 * UserID,AUPvectorƂĐ<BR>
	 * @param Vector vecUserList [U
	 * @return Vector UserPʂ̏Wv
	 */
	private Vector setUserStore(Vector vecUserList){
		Vector vecRet = new Vector();					//UserPʂ̏Wv
		int intRowCnt;									//isj
		String strTmp;									//e|
		String strUserName = new String();				//XgAwKҖ
		String strStoreStudyStartDateNew = new String();//XgAwKJn
		String strStoreStudyStartDateOld = new String();//XgAŏIANZX
		String strUserID = new String();				//XgAUserID
		int intStoreUIDCount = 0;						//XgAANZX
		String strStoreTotalLearnTime = new String();	//XgAݐϊwK
		String strStoreMaxScore = new String();			//XgA链_iŐVj
		String strStoreRawScore = new String();			//XgA链_iōj
		int intStorePerfectScore = 0;					//XgA链__
		int intStoreComplete = 0;						//XgA銮AU
		int intStorePass = 0;							//XgA鍇iAU
		String strStoreAUCount = new String();			//XgAAU

		intRowCnt = vecUserList.size();

		//AUɃ[v
		for(int i = 0 ; i < intRowCnt ; i++){
			Vector vecUser = (Vector)vecUserList.get(i);
			if(i == 0){
				// wKҖ
				strUserName = (String)vecUser.get(G_PROGRESS_LIST_USERNAME);
				//wKJn
				strStoreStudyStartDateNew = (String)vecUser.get(G_PROGRESS_LIST_STUDYSTIME);
				//ŏIANZX
				strStoreStudyStartDateOld = (String)vecUser.get(G_PROGRESS_LIST_LASTACCESS);
				// _̖_
				//strStorePerfectScore = new Integer(intRowCnt*100).toString();
				// AU
				strStoreAUCount = new Integer(intRowCnt).toString();
				// USER_ID
				strUserID = (String)vecUser.get(G_PROGRESS_LIST_USERID);
			}
			// wKJn
			strTmp = (String)vecUser.get(G_PROGRESS_LIST_STUDYSTIME);
			if(!strStoreStudyStartDateNew.equals("") && strTmp.equals("")){
				//NewstrTmpȑO̓t
				int intRet = compareDateTime(strStoreStudyStartDateNew,strTmp);
				if( intRet == DEF_PAST){
					strStoreStudyStartDateNew = strTmp;
				}
			}
			// ŏIANZX
			strTmp = (String)vecUser.get(G_PROGRESS_LIST_LASTACCESS);
			if(!strStoreStudyStartDateOld.equals("") && strTmp.equals("")){
				//OldstrTmpȑO̓t
				int intRet = compareDateTime(strStoreStudyStartDateOld,strTmp);
				if( intRet == DEF_FUTURE){
					strStoreStudyStartDateOld = strTmp;
				}
			}
			// ANZX
			strTmp = (String)vecUser.get(G_PROGRESS_LIST_ACCESSCNT);
			if(!strTmp.equals("")){
				intStoreUIDCount = intStoreUIDCount + new Integer(strTmp).intValue();
			}
			// ݐϊwK
			strTmp = (String)vecUser.get(G_PROGRESS_LIST_TOTALSTUDYTIME);
			if(!strTmp.equals("")){
				double dblLearnTime;
				double dblTime;
				if(!strStoreTotalLearnTime.equals("")){
					dblLearnTime = Double.parseDouble( strStoreTotalLearnTime );
				}else{
					dblLearnTime = (double)0.0;
				}
				dblTime = Double.parseDouble( strTmp );
				dblLearnTime = dblLearnTime + dblTime;
				strStoreTotalLearnTime = new Double(dblLearnTime).toString();
			}

			// ŐV_
			strTmp = (String)vecUser.get(G_PROGRESS_LIST_LASTSCORE);
			if(!strTmp.equals("")){
				//_̃JEg
				intStorePerfectScore++;
				float fNew;
				float fOld;
				if(!strStoreMaxScore.equals("")){
					float fResult = new Float(strStoreMaxScore).floatValue() + new Float(strTmp).floatValue();
					strStoreMaxScore = new Float(fResult).toString();
				}else{
					strStoreMaxScore = strTmp;
				}
			}
			// ō_
			strTmp = (String)vecUser.get(G_PROGRESS_LIST_MAXSCORE);
			if(!strTmp.equals("")){
				float fNew;
				float fOld;
				if(!strStoreRawScore.equals("")){
					float fResult = new Float(strStoreRawScore).floatValue() + new Float(strTmp).floatValue();
					strStoreRawScore = new Float(fResult).toString();
				}else{
					strStoreRawScore = strTmp;
				}
			}

			// AU
			strTmp = (String)vecUser.get(G_PROGRESS_LIST_COMPLETEAU);
			if(strTmp.equals(DEF_AU_COMPLETE)){
				intStoreComplete++;
			}
			
			// iAU
			strTmp = (String)vecUser.get(G_PROGRESS_LIST_PASSAU);
			if(strTmp.equals(DEF_AU_PASS)){
				intStorePass++;
			}
		}
		// wKҖ
		vecRet.addElement(strUserName);
		// wKJn
		vecRet.addElement(strStoreStudyStartDateNew);
		// ŏIANZX
		vecRet.addElement(strStoreStudyStartDateOld);
		// ANZX
		vecRet.addElement(new Integer(intStoreUIDCount).toString());
		// ݐϊwK
		if(!strStoreTotalLearnTime.equals("")){
			double dblTiime = Double.parseDouble( strStoreTotalLearnTime );
			DecimalFormat objFormat = new DecimalFormat( DEF_TOTAL_LEARN_TIME_FORMAT );
			try{
				strStoreTotalLearnTime = objFormat.format(dblTiime);
			}catch(Exception e ){
				strStoreTotalLearnTime = "";
			}
		}
		vecRet.addElement(strStoreTotalLearnTime);
		// ŐV_
		vecRet.addElement(strStoreMaxScore);
		// ō_
		vecRet.addElement(strStoreRawScore);
		// _̖_
		//vecRet.addElement(strStorePerfectScore);
		vecRet.addElement(new Integer(intStorePerfectScore*100).toString());
		
		// AU
		vecRet.addElement(new Integer(intStoreComplete).toString());
		// iAU
		vecRet.addElement(new Integer(intStorePass).toString());
		// AU
		vecRet.addElement(strStoreAUCount);
		// USER_ID
		vecRet.addElement(strUserID);

		return vecRet;
	}

	/**
	 * AUPʏWv
	 * UserID,AUɏWvĂP[UP`tɏWv<BR>
	 * @param Vector vecUserList [U
	 * @return Vector AUPʂ̏Wv
	 */
	private Vector setAuStore(Vector vecUserList){
		Vector vecRet = new Vector();					//AUPʂ̏Wv
		String strUID = new String();					//DB擾UID
		String strUIDOld = new String();				//OUID
		Vector vecUser = new Vector();					//1[U
		String strTmp;									//e|
		int intRowCnt;									//isj
		String strStoreUID = new String();				//XgAUID
		String strUserName = new String();				//XgAwKҖ
		String strUserID = new String();				//XgAUserID
		String strStoreStudyStartDateNew = new String();//XgAwKJn
		String strStoreStudyStartDateOld = new String();//XgAŏIANZX
		int intStoreUIDCount;							//XgAANZX
		String strStoreTotalLearnTime;					//XgAݐϊwK
		String strStoreMaxScore = new String();			//XgA链_iŐVj
		String strStoreRawScore = new String();			//XgA链_iōj
		String strStoreComplete = new String();			//XgA銮AU
		String strStorePass = new String();				//XgA鍇iAU
		String strStoreAURow = new String();			//XgAAU_ROW
		String strStoreSectionRow = new String();		//XgASECTION_ROW

		//AUPʂ̃f[^ێ̈揉
		strStoreUID = "";
		strUserName = "";
		strStoreStudyStartDateNew = "";
		strStoreStudyStartDateOld = "";
		intStoreUIDCount = 0;
		strStoreTotalLearnTime = "";
		strStoreMaxScore = "";
		strStoreRawScore = "";
		strStoreComplete = "0";
		strStorePass = "0";
		strStoreAURow = "";

		//UserID̊wKҏŃ[v
		intRowCnt = vecUserList.size();
		for( int i = 0 ; i < intRowCnt ; i++ ){
			vecUser = (Vector)vecUserList.get(i);

			//1ڂ̏
			if(i == 0){
				//UID擾
				strUIDOld = (String)vecUser.get(G_PROGRESS_REC_UID_COL);
				//wKҖm
				strUserName = (String)vecUser.get(G_PROGRESS_REC_USER_NAME_COL);
				//USERIDm
				strUserID = (String)vecUser.get(G_PROGRESS_REC_USERID_COL);
			}

			//UID
			strUID = (String)vecUser.get(G_PROGRESS_REC_UID_COL);

			//AUIDvsvɕςf[^XgAPsi[
			if(!strUIDOld.equals(strUID)){

				//AUPʏWv
				Vector vecAuStoreData = setAuStoreData(strStoreUID,
														strUserName,
														strUserID,
														strStoreStudyStartDateNew,
														strStoreStudyStartDateOld,
														intStoreUIDCount,
														strStoreTotalLearnTime,
														strStoreMaxScore,
														strStoreRawScore,
														strStoreComplete,
														strStorePass,
														strStoreAURow,
														strStoreSectionRow);

				//f[^XgAsǉ
				vecRet.addElement( vecAuStoreData );

				strUIDOld = strUID;

				//AUPʂ̃f[^ێ̈揉
				strStoreUID = "";
				strStoreStudyStartDateNew = "";
				strStoreStudyStartDateOld = "";
				intStoreUIDCount = 0;
				strStoreTotalLearnTime = "";
				strStoreMaxScore = "";
				strStoreRawScore = "";
				strStoreComplete = "0";
				strStorePass = "0";
				strStoreAURow = "";

			}

			//AUIDv
			if(strUIDOld.equals(strUID)){

				//vUID
				intStoreUIDCount++;
				//UID߂Ĉv
				if(intStoreUIDCount == 1){
					//UIDێ
					strStoreUID = strUID;
					//wKJnێ
					strStoreStudyStartDateNew = (String)vecUser.get(G_PROGRESS_STUDY_DATE_COL);
					//_iōjێ
					strStoreRawScore = (String)vecUser.get(G_PROGRESS_REC_MAXSCORE_COL);
					//AU Rawێ
					strStoreAURow = new Integer(i).toString();
				}
				//_iōjێ
				strTmp = (String)vecUser.get(G_PROGRESS_REC_MAXSCORE_COL);
				if(!strTmp.equals("")){
					if(strStoreRawScore.equals("")){
						strStoreRawScore = (String)vecUser.get(G_PROGRESS_REC_MAXSCORE_COL);
					}else{
						if(new Float(strStoreRawScore).floatValue() < 
							new Float((String)vecUser.get(G_PROGRESS_REC_MAXSCORE_COL)).floatValue()){
							strStoreRawScore = (String)vecUser.get(G_PROGRESS_REC_MAXSCORE_COL);
						}
					}
				}
				//ݐϊwK
				strTmp = (String)vecUser.get(G_PROGRESS_REC_TIME_COL);
				if(!strTmp.equals("")){
					strStoreTotalLearnTime = sumTotal(strStoreTotalLearnTime,(String)vecUser.get(G_PROGRESS_REC_TIME_COL));
				}
				//ŏIANZXێ
				strStoreStudyStartDateOld = (String)vecUser.get(G_PROGRESS_STUDY_DATE_COL);
				//_iŐVj
				strTmp = (String)vecUser.get(G_PROGRESS_REC_RAWSCORE_COL);
				if(!strTmp.equals("")){
					strStoreMaxScore = strTmp;
				}
				//ێ
				if(judgeCompletedResult((String)vecUser.get(G_PROGRESS_LESSON_STATUS_COL))){
					strStoreComplete = DEF_AU_COMPLETE;
				}
				//iێ
				if(judgePassResult((String)vecUser.get(G_PROGRESS_LESSON_STATUS_COL))){
					strStorePass = DEF_AU_PASS;
				}
			}

			//OUIDێ
			strUIDOld = strUID;
		}

		if(intStoreUIDCount>0){
				//AUPʏWv
				Vector vecAuStoreData = setAuStoreData(strStoreUID,
														strUserName,
														strUserID,
														strStoreStudyStartDateNew,
														strStoreStudyStartDateOld,
														intStoreUIDCount,
														strStoreTotalLearnTime,
														strStoreMaxScore,
														strStoreRawScore,
														strStoreComplete,
														strStorePass,
														strStoreAURow,
														strStoreSectionRow);
				//f[^XgAsǉ
				vecRet.addElement( vecAuStoreData );
		}
		return vecRet;
	}

	/**
	 * wKAUPʏWv
	 * @param String strStoreUID UID
	 * @param String strUserName wKҖ
	 * @param String strUserID UserID
	 * @param String strStoreStudyStartDateNew wKJn
	 * @param String strStoreStudyStartDateOld ŏIANZX
	 * @param int intStoreUIDCount ANZX
	 * @param String strStoreTotalLearnTime ݐϊwK
	 * @param String strStoreMaxScore _iŐVj
	 * @param String strStoreRawScore _iōj
	 * @param String strStoreComplete AU
	 * @param String strStorePass iAU
	 * @param String strStoreAURow AU_ROW
	 * @param String strStoreSectionRow SECTION_ROW
	 * @return Vector Wv
	 */
	private Vector setAuStoreData(String strStoreUID,
									String strUserName,
									String strUserID,
									String strStoreStudyStartDateNew,
									String strStoreStudyStartDateOld,
									int intStoreUIDCount,
									String strStoreTotalLearnTime,
									String strStoreMaxScore,
									String strStoreRawScore,
									String strStoreComplete,
									String strStorePass,
									String strStoreAURow,
									String strStoreSectionRow){

		Vector vecAuWrk = new Vector();
		//UID
		vecAuWrk.addElement(strStoreUID);
		//wKҖ
		vecAuWrk.addElement(strUserName);
		//UserID
		vecAuWrk.addElement(strUserID);
		//wKJn
		vecAuWrk.addElement(strStoreStudyStartDateNew);
		//ŏIANZX
		vecAuWrk.addElement(strStoreStudyStartDateOld);
		//ANZX
		vecAuWrk.addElement(new Integer(intStoreUIDCount).toString());
		//ݐϊwK
		vecAuWrk.addElement(convertSecToHour(strStoreTotalLearnTime));
		//_iŐVj
		vecAuWrk.addElement(strStoreMaxScore);
		//_iōj
		vecAuWrk.addElement(strStoreRawScore);
		//AU
		vecAuWrk.addElement(strStoreComplete);
		//iAU
		vecAuWrk.addElement(strStorePass);
		//AU_ROW
		vecAuWrk.addElement(strStoreAURow);
		//SECTION_ROW
		vecAuWrk.addElement(strStoreSectionRow);

		return vecAuWrk;
	}
}

