/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


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
【配布サイトのURL】 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) ______________________________________.
*/

//
// 学習状況(LO一覧)アクションクラス
// 
//
//	変更履歴
//	2004.01.08 新規作成		ishizaki 
//

package jp.co.ntt.lms.xms.logsumup;

import java.util.List;

import jp.co.ntt.lms.xms.framework.Constant;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.base.Logic;
import jp.co.ntt.lms.xmo.util.DebugLog;

/**
 * 学習状況(LO一覧)アクションクラス
 * 
 * <pre>
 * 	LO一覧では次の形式で表示項目をわけます
 * 
 * グループが選ばれた時は 学習開始日時,最終アクセス日時, 総アクセス回数（回）,累積滞在時間（分）,完了者数(%),合格者数(%)
 * ユーザが選ばれた時は 学習開始日時,最終アクセス日時,総アクセス回数（回）, 累積滞在時間（分）, 最新得点(%), 最高得点(%),完了,合格
 * 
 * 
 * </pre>
 * 
 * @author ishizaki
 * 
 */
public class LoLogLearnMaterialStatusAction extends LoLogLearnStatusAction {

	//---------------------- LoLosgLearnStatusAction（Abstractクラスの実装メソッド)start------------//
	
	/** 
	 * 実行するLogicクラス(LoLogLearnMaterialStatusLogic)を返却する .
	 * <br>
	 *
	 * <pre>
	 * 引数 actionの種類を下記に記す
	 *
	 *		グループ/教材		LoLogConstant.LOG_SELECT_G_M
	 *		グループ/コンテナ	LoLogConstant.LOG_SELECT_G_C
	 *		ユーザ/教材			LoLogConstant.LOG_SELECT_U_M
	 *		ユーザ/コンテナ		LoLogConstant.LOG_SELECT_U_C
	 *
	 * 
	 * </pre>
	 * 
	 * @param action 		選択の仕方(グループ/コンテナ,グループ/教材,ユーザ/コンテナ,ユーザ/教材)
	 * @param loId 			LOID	
	 * @param loIdList 		LOIDのリスト(コンテナ指定の場合そのLOIDのリスト
	 * @param userId 		ユーザＩＤ
	 * @param geroupIdList	グループIDのリスト(グループが選ばれた場合グループの下のリスト)
	 * @param userCount 	グループの下にいるユーザの人数
	 * @param loCount  	 	コンテナの下にあるLOの数
	 *
	 * @return Logic実行クラス (LoLogLearnMaterialStatusLogic)
	 * @exception XmsException
	 *
	 */
	public Logic[] getLearnStatusLogic(
		LoLogLearnStatusParam param,
		int action,
		String loId,
		List loIdList,
		String userId,
		List groupIdList,
		int userCount,
		int loCount)
		throws XmsException {
		Logic[] logic = {new LoLogLearnMaterialStatusLogic(param,action,loId,loIdList,userId,groupIdList,userCount,loCount) };

		return logic;
	}

	/**
	 * 画面名称タイトルの取得
	 * 
	 * @return 画面タイトル
	 * @exception XmsException
	 * 
	 */
	public String getTitle()throws XmsException {
		try{
			return LoLogConstant.WIN_TITLE_MATERIAL_LEARN_STATUS_o;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}
		
					//((((((((((((((((((( CSV用start )))))))))))))))))))))))))))))))))//

	/**
	 * 検索条件用CSV用文字列の取得.
	 * 
	 * 検索条件設定画面で設定された検索条件をCSV文字列にします<br>
	 *
	 * <pre>
	 *  (例)次の形式で文字列を作成します
	 *
	 * 学習開始日時:2003/06/24 最終アクセス日時:--- 総アクセス回数（回）:2以上 累積滞在時間（分）:--- 完了者数(%):--- 合格者数(%):---
	 * 検索条件が設定されていない項目は---が出力されます
	 * ※表示ないようはグループを選択した場合とユーザを選択した場合でことなります詳細はクラスのコメントを参照
	 * 
	 * 
	 * その他
	 * デバックレベルを10にすると検索条件を(LoLogLearnStatusParam)をデバックする
	 * </pre>
	 *
	 * @param param 学習状況検索条件の設定されたオブジェクトLoLogLearnStatusParam
	 * @return 検索条件の設定されたCSV用文字列
	 * @exceptiion XmsException
	 * @see jp.co.ntt.lms.xms.logsumup.LoLogLearnStatusAction#getReferenceConditionsCsv
	 */
	public String getReferenceConditionsCsv(LoLogLearnStatusParam refer)throws XmsException {
		try{
			//検索条件の中身
			DebugLog.write(this.getClass(),refer.toString(),DebugLog.ROW );
			StringBuffer buffer = new StringBuffer();
	
			//学習開始日(date_start)
			buffer.append(LoLogConstant.STR_DATE_START_o + ":");
			buffer.append(getHenceforth(refer.getDateStart(),refer.getDateStartCondition()));
			buffer.append(",");
	
			//最終アクセス日時(date_last)
			buffer.append(LoLogConstant.STR_DATE_LAST_o + ":");
			buffer.append(getHenceforth(refer.getDateLast(),refer.getDateLastCondition()));
			buffer.append(",");
	
			//総アクセス回数(total_access)
			buffer.append(LoLogConstant.STR_TOTAL_ACCESS_o + ":");
			buffer.append(getAboveString(refer.getTotalAccess(),refer.getTotalAccessCondition()));
			buffer.append(",");
	
			//累積滞在時間(total_learn_time)					
			buffer.append(LoLogConstant.STR_TOTAL_LEARN_TIME_o + ":");
			buffer.append(getAboveString(refer.getTotalLearnTime(),refer.getTotalLearnTimeCondition()));
			buffer.append(",");
	
			switch (this.action) {
				//グループの場合
				case LoLogConstant.LOG_SELECT_G_M:
				case LoLogConstant.LOG_SELECT_G_C:

						//完了者数(user_complete_condition)							
						buffer.append(LoLogConstant.STR_USER_COMPLETE_o + ":");
						buffer.append(getAboveString(refer.getUserComplete(),refer.getUserCompleteCondition()));
						buffer.append(",");
			
						//合格者数(user_pass)							
						buffer.append(LoLogConstant.STR_USER_PASS_o + ":");
						buffer.append(getAboveString(refer.getUserPass(),refer.getUserPassCondition()));
	
						break;
						
				//ユーザの場合
				case LoLogConstant.LOG_SELECT_U_M:
				case LoLogConstant.LOG_SELECT_U_C:

						//最新得点(mat_newest_score)					
						buffer.append(LoLogConstant.STR_S_NEWEST_SCORE_o + ":");
						buffer.append(getAboveString(refer.getMatNewestScore(),refer.getMatNewestScoreCondition()));
						buffer.append(",");
			
						//最高得点(mat_high_score)					
						buffer.append(LoLogConstant.STR_S_HIGH_SCORE_o + ":");
						buffer.append(getAboveString(refer.getMatHighScore(),refer.getMatHighScoreCondition()));
						buffer.append(",");
			
						//完了(complete_condition)
						buffer.append(LoLogConstant.STR_CALC_END_o + ":");
						buffer.append(getCompletion(refer.getCompleteCondition()));
						buffer.append(",");
			
						//合格(pass_condition)					
						buffer.append(LoLogConstant.STR_PASSTITLE_o + ":");
						buffer.append(getPass(refer.getPassCondition()));
				
						break;
	
	
				default :
					break;
	
			}
	
	
			return buffer.toString();
		} catch(XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * ログ結果ヘッダCSV文字列の取得.
	 * 
	 * <pre>
	 * 次の形式でCSV文字列を作成します
	 * (例)
	 * ユーザ名,外部ユーザＩＤ,所属グループＩＤ,外部グループＩＤ,学習開始日時,最終アクセス日時,
	 * 総アクセス回数（回）,累積滞在時間（分）,最新得点(%),最高得点(%),完了,合格,アサイン
	 * ※表示ないようはグループを選択した場合とユーザを選択した場合でことなります詳細はクラスのコメントを参照
	 * 
	 * 
	 * </pre>
	 * @return ログ取得結果ヘッダCSV文字列
	 * @exception XmsException
	 * @see jp.co.ntt.lms.xms.logsumup.LoLogLearnStatusAction#getLogHeaderCsv()
	 * 
	 */
	public String getLogHeaderCsv()throws XmsException {
		try{
			StringBuffer buffer = new StringBuffer();
			//ＬＯ名
			buffer.append(LoLogConstant.STR_LO_NAME_o);
			buffer.append(",");
			//外部ID
			buffer.append(LoLogConstant.STR_FOREIGN_ID_o);
			buffer.append(",");
	
			//学習開始日時
			buffer.append(LoLogConstant.STR_DATE_START_o);
			buffer.append(",");
	
			//最終アクセス日時
			buffer.append(LoLogConstant.STR_DATE_LAST_o);
			buffer.append(",");
	
			//総アクセス回数
			buffer.append(LoLogConstant.STR_TOTAL_ACCESS_o);
			buffer.append(",");
	
			//累積滞在時間
			buffer.append(LoLogConstant.STR_TOTAL_LEARN_TIME_o);
			buffer.append(",");
	
	
			switch (this.action) {
				//グループの場合
				case LoLogConstant.LOG_SELECT_G_M:
				case LoLogConstant.LOG_SELECT_G_C:

						//完了者数
						buffer.append(LoLogConstant.STR_USER_COMPLETE_o);
						buffer.append(",");			
						//合格者数
						buffer.append(LoLogConstant.STR_USER_PASS_o);
	
						break;
						
				//ユーザの場合
				case LoLogConstant.LOG_SELECT_U_M:
				case LoLogConstant.LOG_SELECT_U_C:

						//最新得点
						buffer.append(LoLogConstant.STR_S_NEWEST_SCORE_o);
						buffer.append(",");			
						//最高得点
						buffer.append(LoLogConstant.STR_S_HIGH_SCORE_o);
						buffer.append(",");
						//完了
						buffer.append(LoLogConstant.STR_CALC_END_o);
						buffer.append(",");
						//合格
						buffer.append(LoLogConstant.STR_PASSTITLE_o);
						buffer.append(",");			
						//アサイン
						buffer.append(LoLogConstant.STR_ASSAIN_o);

						break;
	
				default :
					break;
			}
			

			//改行
			buffer.append(Constant.LINE_SEPARATOR);
			
	
			return buffer.toString();
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}

	}

	/**
	 * ログ取得結果CSV文字列の取得.
	 *
	 * <pre>
	 * LoLogLearnStatusResultの内容をCSV文字列にします
	 * 
	 * ユーザ名,外部ユーザID,所属グループ,外部グループID,学習開始日時,最終アクセス日時,総アクセス回数,累積滞在時間,完了者数,合格者数,アサイン
	 * ※表示ないようはグループを選択した場合とユーザを選択した場合でことなります詳細はクラスのコメントを参照
	 * 下から２段
	 * 合計　総アクセス回数,累積滞在時間
	 * 平均  総アクセス回数,累積滞在時間,完了LO数,合格LO数,最新得点,最高得点,完了,合格
	 * 
	 * (例)
	 * テストユーザ１,テストユーザ１,root/テスト/テスト2/テスト３,テスト３,2003/5/6 13:06,2003/5/6 13:06,1,0,0/0(0%),0/0(0%),完了,合格
	 * テストユーザ１,テストユーザ１,root/テスト/テスト2/テスト３,テスト３,2003/5/6 13:06,2003/5/6 13:06,1,0,0/0(0%),0/0(0%),完了,合格
	 * テストユーザ１,テストユーザ１,root/テスト/テスト2/テスト３,テスト３,2003/5/6 13:06,2003/5/6 13:06,1,0,0/0(0%),0/0(0%),完了,合格
	 *
	 *
	 * 合計	,,,,,					1,0
	 * 平均	,,,1,0,0%,0%,100%,100%	
	 *
	 *
	 * </pre>
	 * @param log LoLogLearnStatusResult(ログデータ)
	 * @return ログ取得結果CSV文字列
	 * @exception XmsException
	 * @see jp.co.ntt.lms.xms.logsumup.LoLogLearnStatusAction#getLogCsv()
	 */
	public String getLogCsv(LoLogLearnStatusResult log)throws XmsException {
		try{
			LoLogCommon_inc cominc = new LoLogCommon_inc();
			String userCount = null;
			userCount = head.getUserCount();


			StringBuffer buffer = new StringBuffer();
			log.beforeFirst();
	
			while (log.next()) {
				//LO名
				buffer.append(log.getName());
				buffer.append(",");
	
				//LO外部ID
				buffer.append(log.getforeinId());
				buffer.append(",");
				
				//学習開始日
				buffer.append(getEmptyStr(log.getDateStart()));
				buffer.append(",");
	
				//最終アクセス日時
				buffer.append(getEmptyStr(log.getDateLast()));
				buffer.append(",");
	
				//総アクセス回数
				buffer.append(getEmptyStr(log.getTotalAccess()));
				buffer.append(",");
	
				//累積滞在時間
				buffer.append(getEmptyStr(log.getTotalLearnTime()));
				buffer.append(",");
	
				switch (this.action) {
					//グループの場合
					case LoLogConstant.LOG_SELECT_G_M:
					case LoLogConstant.LOG_SELECT_G_C:

							//完了者数
							buffer.append(cominc.toCSVFraction(cominc.conversionZeo(log.getUserCompleteCondition()), userCount));
							buffer.append(",");
							//合格者数
							buffer.append(cominc.toCSVFraction(cominc.conversionZeo(log.getUserPass()), userCount));

							break;
							
					//ユーザの場合
					case LoLogConstant.LOG_SELECT_U_M:
					case LoLogConstant.LOG_SELECT_U_C:

						// ログがあれば
						if(log.isLoLog()){
							//最新得点
							buffer.append(cominc.conversionZeo(log.getMatNewestScore()));
							buffer.append("/");
							buffer.append(cominc.conversionZeo(log.getfullScore()));
							buffer.append("(" + cominc.conversionZeo(log.getNewScorePercent()));
							buffer.append(LoLogConstant.STR_PERCENT_o + ")");
							buffer.append(",");

							//最高得点
							buffer.append(cominc.conversionZeo(log.getMatHighScore()));
							buffer.append("/");
							buffer.append(cominc.conversionZeo(log.getfullScore()));
							buffer.append("(" + cominc.conversionZeo(log.getHighScorePercent()));
							buffer.append(LoLogConstant.STR_PERCENT_o + ")");
							buffer.append(",");
						//ログがなければ
						} else {
							buffer.append(",");
							buffer.append(",");
						}
						//完了
						buffer.append(cominc.changeEmptyStr(cominc.getCompleteStr(log.getCompleteCondition())));
						buffer.append(",");
						//合格
						buffer.append(cominc.changeEmptyStr(cominc.getPassStr(log.getPassCondition())));
						buffer.append(",");
		
						//アサイン
						buffer.append(getEmptyStr(log.getAssain()));

						break;
		
					default :
						break;
				}
				//改行
				buffer.append(Constant.LINE_SEPARATOR);
			}
			// カーソルを先頭行の直前の行に移動する。
			log.beforeFirst();

			// 合計
			buffer.append(LoLogConstant.STR_SUM_o);
			buffer.append(",");
			buffer.append(",");
			buffer.append(",");
			buffer.append(",");
			// 総アクセス回数
			if (log.getSumTotalAccess() != null) {
				buffer.append(log.getSumTotalAccess());
			}
			buffer.append(",");
			// 累積滞在時間
			if (log.getSumTotalLearnTime() != null) {
				buffer.append(log.getSumTotalLearnTime());
			}
			buffer.append(",");

			switch (this.action) {
				//グループの場合
				case LoLogConstant.LOG_SELECT_G_M:
				case LoLogConstant.LOG_SELECT_G_C:
				
					buffer.append(",");

					break;
				
				case LoLogConstant.LOG_SELECT_U_M:
				case LoLogConstant.LOG_SELECT_U_C:

					buffer.append(",");
					buffer.append(",");
					buffer.append(",");

					break;
			}

			//改行
			buffer.append(Constant.LINE_SEPARATOR);

			// 平均
			buffer.append(LoLogConstant.STR_AVE_o);
			buffer.append(",");
			buffer.append(",");
			buffer.append(",");
			buffer.append(",");
			// 総アクセス回数
			if (log.getAvgTotalAccess() != null) {
				buffer.append(log.getAvgTotalAccess());
			}
			buffer.append(",");
			// 累積滞在時間
			if (log.getAvgTotalLearnTime() != null) {
				buffer.append(log.getAvgTotalLearnTime());
			}
			buffer.append(",");

			switch (this.action) {
				//グループの場合
				case LoLogConstant.LOG_SELECT_G_M:
				case LoLogConstant.LOG_SELECT_G_C:
					// 完了者数
					if (log.getAvgCompleteCondition() != null) {
						buffer.append(log.getAvgCompleteCondition());

					}
					buffer.append(",");
					// 合格者数
					if (log.getAvgUserPass() != null) {
						buffer.append(log.getAvgUserPass());
					}

					break;

				case LoLogConstant.LOG_SELECT_U_M:
				case LoLogConstant.LOG_SELECT_U_C:
					// 最新得点
					if (log.getAvgMatNewestScore() != null) {
						buffer.append(log.getAvgMatNewestScore());
					}
					buffer.append(",");
					// 最高得点
					if (log.getAvgMatHighScore() != null) {
						buffer.append(log.getAvgMatHighScore());
					}
					buffer.append(",");
					// 完了
					if (log.getAvgCompleteConditionList() != null) {
						buffer.append(log.getAvgCompleteConditionList());
					}
					buffer.append(",");
					// 合格
					if (log.getAvgPassConditionList() != null) {
						buffer.append(log.getAvgPassConditionList());
					}

					break;
			}
			return buffer.toString();
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}

	}
}
