/*
このファイルの中身は、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) ______________________________________.
*/

//
// ログ画面共通データ取得処理クラス
//
//
//	変更履歴
//		2004.01.08 新規作成 A.Shimoma
//
package jp.co.ntt.lms.xms.logsumup;

import java.util.Calendar;
import java.util.Date;

import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.util.XMODate;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.XmsWarningException;

/**
 * ログ画面共通データ取得クラス。<br>
 * 
 * @author shimoma
 */
public class LoLogResultCommon {

	/** 検索画面用Bean */
	private LoLogSearchResult bean;

	/**
	 * コンストラクタ
	 * 
	 * @param subordinateFlg 配下フラグ
	 * @param userId         ユーザID
	 * @param loId           LOID
	 */
	public LoLogResultCommon(
		String subordinateFlg,
		String userId,
		String loId) {
		//画面表示用Bean生成
		bean = new LoLogSearchResult();

		//配下フラグのセット。配下フラグがnullであればデフォルトでoff(直下になる)	
		String flg = subordinateFlg == null ? "off" : subordinateFlg;
		bean.setSubordinateflg(flg);

		//LoIdのセット
		bean.setLoID(loId);

		//ユーザIDを取得
		//ユーザであるかグループであるか
		bean.setGroup(new LoLogCommon_inc().isGroup(userId));
		//ユーザIdまたはグループIDのセット
		bean.setGroupOrUserId(userId);

	}

	/**
	 * グループ(ユーザ)・ＬＯ情報取得メソッド。<BR>
	 * グループ(ユーザ)・ＬＯの各データ取得メソッドをコールし、<BR>
	 * LoLogSearchResultに設定し返却します。
	 * 
	 * @return bean 画面表示用Bean
	 */
	public LoLogSearchResult getLoLogSearchResult() throws XmsException {

		if (bean.isGroup()) {
			//グループの場合LoLogSeachResultにグループ名と外部ＩＤを設定
			setGroupDetails();
			//LoLogSeachResultに学習者人数をセットする
			setGroupAndPeopleDetails();
		} else {
			//ユーザの場合LoLogSeachResultにユーザ名と外部ＩＤを設定
			setPeopleDetails();
		}
		//LoLogSeachResultにLO名称とLO外部IDとLOTYPEを設定する
		setLoDetails();
		//LoLogSeachResultに検索期間from toの初期表示を設定する
		setDefultSearchDate();
		//LoLogSeachResultにrealLOIDを設定する
		setLoClientDetail();

		//LOTYPEがコンテナかどうかのチェック
		if (new LoLogCommon_inc().isContainer(bean.getLoType())) {
			//コンテナである
			bean.setContainer(true);
		} else {
			//教材である
			bean.setMateriall(true);
		}

		//画面表示用Beanを返却
		return bean;

	}

	/**
	 * リアルLOID取得メソッド。<BR>
	 * 指定されたLOIDよりリアルLOIDを取得し、LoLogSeachResultに設定します。
	 * 
	 * @exception XmsException
	 */
	private void setLoClientDetail() throws XmsException {
		try {
			LoClient client = new LoClient();

			if (client.getRealLOIDFromLOID(bean.getLoID())) {
				bean.setRealLOID(client.getRealLOIDResult());
			} else {
				//検索がうまくいかなかった
				if (client.isErr()) {
					//エラーの場合
					throw new XmsSystemException(client.getMessage());
				} else {
					//警告の場合
					throw new XmsWarningException(client.getMessage());
				}
			}
			client = null;
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 学習者(ユーザ)人数取得メソッド。<BR>
	 * 配下フラグより直下または配下を判断し、
	 * 学習者(ユーザ)数及びメッセージをLoLogSeachResultに設定します。
	 * 
	 * @exception XmsException
	 */
	private void setGroupAndPeopleDetails() throws XmsException {
		try {
			GroupAndPeopleClient client = new GroupAndPeopleClient();

			if (bean.getSubordinateflg().equals("on")) {
				//配下人数の設定
				bean.setUserCount(
					String.valueOf(
						client.getUserCount(bean.getGroupOrUserId(), 0)));
				//配下ユーザであるメッセージをセット
				bean.setCondidateTotalMassage(
					LoLogConstant.STR_SUBORDINATE_USER);
			} else {
				//直下人数の設定
				bean.setUserCount(
					String.valueOf(
						client.getUserCount(bean.getGroupOrUserId())));
				//直下のユーザであるメッセージをセット
				bean.setCondidateTotalMassage(
					LoLogConstant.STR_DIRECTLY_UNDER_USER);
			}

			client = null;

		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}

	}

	/**
	 * ユーザ情報取得メソッド。<BR>
	 * 指定されたユーザIDより外部IDおよびユーザ名を取得し、<BR>
	 * LoLogSeachResultに設定します。
	 * 
	 * @exception XmsException
	 */
	private void setPeopleDetails() throws XmsException {
		try {
			PeopleClient client = new PeopleClient();
			//検索条件にユーザIDをセット
			client.setWhereUserID(bean.getGroupOrUserId());

			if (client.select() == false) {
				//検索がうまくいかなかった
				if (client.isErr()) {
					//エラーの場合
					throw new XmsSystemException(client.getMessage());
				} else {
					//警告の場合
					throw new XmsWarningException(client.getMessage());
				}
			}

			//ユーザデータの取得
			if (client.next()) {
				//外部IDの取得
				bean.setForeignId(client.getForeignID());
				//ユーザ名の取得
				bean.setGroupOrUserName(client.getUserName());
			}
			client = null;

		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * グループ情報取得メソッド。<BR>
	 * 指定されたグループIDより外部IDおよびグループ名を取得し、<BR>
	 * LoLogSeachResultに設定します。
	 * 
	 * @exception XmsException
	 */
	private void setGroupDetails() throws XmsException {
		try {
			GroupsClient client = new GroupsClient();
			//検索条件を設定
			client.setWhereGroupID(bean.getGroupOrUserId());

			if (client.select() == false) {
				//検索がうまくいかなかった
				if (client.isErr()) {
					//エラーの場合
					throw new XmsSystemException(client.getMessage());
				} else {
					//警告の場合
					throw new XmsWarningException(client.getMessage());
				}
			}

			//グループデータの取得
			if (client.next()) {
				//グループ名の取得
				bean.setGroupOrUserName(client.getGroupName());
				//グループ外部IDの取得
				bean.setForeignId(client.getForeignID());
			}
			client = null;

		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * ＬＯ情報取得メソッド。<BR>
	 * 指定されたLOIDよりLO名およびLO外部IDを取得し、<BR>
	 * LoLogSeachResultに設定します。
	 * 
	 * @exception XmsException
	 */
	private void setLoDetails() throws XmsException {
		try {

			// LO情報をLOXMOより取得します。
			LoClient client = new LoClient();
			// 検索条件を設定
			client.setWhereLoID(bean.getLoID());
			if (client.select() == false) {
				// 検索がうまくいかなかった場合
				if (client.isErr()) {
					// エラーの場合
					throw new XmsSystemException(client.getMessage());
				} else {
					// 警告の場合
					throw new XmsWarningException(client.getMessage());
				}
			}

			// LOデータの取得
			if (client.next()) {
				//LO名を取得
				bean.setLoName(client.getLoTytle());
				//LO外部IDを取得
				bean.setLoForeignId(client.getForeignID());
				//LOタイプを取得
				bean.setLoType(client.getLoType());
			}

			client = null;
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}

	}

	/**
	 * 検索期間初期表示用メソッド。<BR>
	 * 現在年月より１年前をform、現在年月をtoとし、<BR>
	 * LoLogSeachResultに設定します。
	 * 例.
	 * from 現在の年月の1年前	2002/04
	 * to   現在の年月			2003/04
	 * 
	 */
	private void setDefultSearchDate() {
		//一年前を取得(FROM)
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		cal.add(Calendar.YEAR, -1);
		// 検索期間(from) YYYY/MM
		bean.setFromDate(XMODate.parseYYYYMMDD(cal.getTime()).substring(0, 7));
		// 検索期間(TO) YYYY/MM
		bean.setToDate(XMODate.parseYYYYMMDD(new Date()).substring(0, 7));
	}

}
