/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	XMO情報を取得する汎用クラス
//
//		変更履歴
//			2005.02.03  新規作成  Katsuhiko.Sakurai(UNITEC)
//
//	機能
//
//	このクラスはXMO情報を取得する汎用クラスです。
//
////////////////////////////////////////////////////////////////
package jp.co.ntt.lms.lo.progress.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import jp.co.ntt.lms.xmo.XMOException;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Groups.GroupsData;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.Lo.LoData;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
import jp.co.ntt.lms.xmo.People.PeopleClient;

/**
 * XMO情報を取得する汎用クラスです。
 * 
 * @author Katsuhiko Sakurai (UNITEC)
 * @version 1.0
 */
public final class XMOInformationGetter {
	
	/**
	 * 指定されたLOIDからLOを取得します。
	 * 
	 * @param loID LoID
	 * @return LoClient Lo情報 
	 * @throws Exception
	 */
	public static LoClient getLO( String loID ) throws Exception {
		
		LoClient loClient = new LoClient();

		// 検索条件にLOIDを設定する
		loClient.setWhereLoID( loID );
		
		// 検索実行
		if( loClient.select() == false ) return null;

		// 検索結果の取得
		if( loClient.next() == false ) return null;
		
		return loClient;
	}
	
	/**
	 * 指定された子供LOIDからLO階層情報を取得します。
	 * 
	 * @param childLOID 子供LoID
	 * @return LoRelationClient Lo階層情報
	 * @throws Exception
	 */
	public static LoRelationClient getLORelation( String childLOID ) throws Exception {
		
		LoRelationClient relationClient = new LoRelationClient();

		// 検索条件にLOIDを設定する
		relationClient.setWhereChildID( childLOID );
		
		// 検索実行
		if( relationClient.select() == false ) return null;

		// 検索結果の取得
		if( relationClient.next() == false ) return null;
		
		return relationClient;
	}

	/**
	 * 指定されたユーザIDからユーザ情報を取得します。
	 * 
	 * @param userID ユーザID
	 * @return PeopleClient ユーザ情報
	 * @throws Exception
	 */
	public static PeopleClient getPeople( String userID ) throws Exception {
		
		PeopleClient client = new PeopleClient();

		// 検索条件にUserIDを設定する
		client.setWhereUserID( userID );
		
		// 検索実行
		if( client.select() == false ) {
			return null;
		}

		// 検索結果の取得
		if( client.next() == false ) return null;
		
		return client;
	}
	
	/**
	 * 指定されたグループIDからグループ情報を取得します。
	 * 
	 * @param groupID グループID
	 * @return GroupsClient グループ情報
	 * @throws Exception
	 */
	public static GroupsClient getGroup( String groupID ) throws Exception {
		
		GroupsClient client = new GroupsClient();

		// 検索条件にUserIDを設定する
		client.setWhereGroupID( groupID );
		
		// 検索実行
		if( client.select() == false ) {
			return null;
		}

		// 検索結果の取得
		if( client.next() == false ) return null;
		
		return client;
	}
	
	/**
	 * 指定されたLOIDの親LOの中で指定ユーザにアサインされているLOのIDを取得します。
	 * 
	 * @param loID 検索するLOID
	 * @param userID ユーザID
	 * @param assignType アサイン種別
	 *     AssignmentsClient.NON_TYPE    :: アサインタイプ指定なし
	 *     AssignmentsClient.LEARN_TYPE  :: 学習アサインされているもの
	 *     AssignmentsClient.MANAGE_TYPE :: 管理アサインされているもの
	 * @return String LOID
	 */
	public static String getAssignedParentLOID(String loID, String userID, int assignType ) throws Exception {
	
		// 権限チェックフラグ
		boolean isAuth = false;

		// 権限対象LOのリストを取得します。
		// XMSBaseを使用して、ユーザが使用できるLOリストを取得します。
		XMSBaseClient baseClient = new XMSBaseClient();
		if( baseClient.searchRootLoList( userID, assignType ) == false ) {
			throw new XMOException( baseClient.getMessage() );
		}

		LoData[] rootLOs = baseClient.getRootLoList();
		// 権限のあるLOIDリストを作成する。
		List authLOList = new ArrayList();
		for( int i = 0; i < rootLOs.length; i++ ) {
			authLOList.add( rootLOs[i].getLoID() );
		}

		// 指定LOIDのパスを取得します。
		// 参照LOIDのパスを取得する
		LoRelationClient loRelation = new LoRelationClient();
		if( loRelation.searchPath(loID) == false ) {
			// パス検索がうまくいかなかった場合
			throw new XMOException( loRelation.getMessage() );
		}

		// パス毎に権限チェックを行う。
		while( loRelation.next() ) {
			String[] path = loRelation.getPath();
			for( int i = 0; i < path.length; i++ ) {

				// 見つかればアサインされているIDを返す
				if( authLOList.contains( path[i] ) ) return path[i];
			}
		}

		// 見つからなければ空文字を返す
		return "";
	}

	/**
	 * 指定されたユーザにアサインされているルートLOリストを取得します。
	 * 
	 * @param userID ユーザID
	 * @return List ルートLOリスト
	 * @throws XMOException
	 * @throws Exception
	 */
	public static List getRootLoList( String userID ) throws XMOException, Exception {
		// アサインタイプ指定なし
		return XMOInformationGetter.getRootLoList(userID, 0);
	}
	
	/**
	 * 指定されたユーザにアサインされているLOのルートリストを取得します。
	 * 
	 * @param userID ユーザID
	 * @param assignType アサイン種別　0:指定なし 1:学習　2:管理
	 * @return List ルートLOリスト
	 * @throws XMOException
	 * @throws Exception
	 */
	public static List getRootLoList( String userID, int assignType ) throws XMOException, Exception {

		XMSBaseClient xmsBaseClient = new XMSBaseClient();
	
		// ルートLOリスト検索処理(管理アサインされているものを検索)
		if( xmsBaseClient.searchRootLoList(userID, assignType) == false ) {
			throw new XMOException( xmsBaseClient.getMessageData() );
		}

		// 検索がうまくいった場合
		return new ArrayList(Arrays.asList(xmsBaseClient.getRootLoList()));
	}

	/**
	 * 指定されたユーザにアサインされているグループのルートリストを取得します。
	 * 
	 * @param userID ユーザID
	 * @return List ルートグループリスト
	 * @throws XMOException
	 * @throws Exception
	 */
	public static List getRootGroupIDList( String userID ) throws XMOException, Exception {

		XMSBaseClient xmsBaseClient = new XMSBaseClient();
	
		// ルートLOリスト検索処理(管理アサインされているものを検索)
		if( xmsBaseClient.searchRootGroupList(userID) == false ) {
			throw new XMOException( xmsBaseClient.getMessageData() );
		}
		
		GroupsData[] groupData = xmsBaseClient.getRootGroupList();
		ArrayList list = new ArrayList();
		
		for(int i=0; i<groupData.length; i++) {
			list.add(groupData[i].getGroupID());
		}

		return list;
	}

	/**
	 * 指定されたユーザ・グループの子供グループ・ユーザのリストを取得します。
	 * 
	 * @param parentID 親グループ・ユーザID
	 * @return List 子供グループ・ユーザリスト
	 * @throws Exception
	 */
	public static List getChildGroupIDList(String parentID) throws Exception {
		
		GroupAndPeopleClient groupAndPeopleClient = new GroupAndPeopleClient();
		groupAndPeopleClient.setParentID( parentID );
		
		if( groupAndPeopleClient.select() == false ) return null;
		
		ArrayList list = new ArrayList();
		while(groupAndPeopleClient.next()){
			list.add( groupAndPeopleClient.getChildID() );
		}

		return list;
	}
}
