/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	カタログツールクラス
//
//		変更履歴
//			2005.02.17 新規作成  梅原 浩司
//ADD 2005/02/24 START Katsuhiko Kagami(UNITEC) [LO購入]
//          2005.02.10 s-mori
//                     LOリスト数を特定の変数に代入するよう修正。
//          2005.02.14 Katsuhiko Kagami(UNITEC)
//                     購入申請に対応。
//ADD 2005/02/24 END Katsuhiko Kagami(UNITEC) [LO購入]
//
//	機能
//
//	このクラスはカタログツールのクラスです。
//
////////////////////////////////////////////////////////////////

package jp.co.ntt.lms.xmf.tools.lo.catalog;

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

import java.util.*;
import java.net.URLEncoder;

import jp.co.ntt.lms.xmf.tools.ToolBase;
import jp.co.ntt.lms.xmf.tools.xmo.Com.ComFunction;
import jp.co.ntt.lms.xmf.common.CommonFunction;

import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.Lo.LoData;
import jp.co.ntt.lms.xmo.Lo.LoExtend.LoExtendTable;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
import jp.co.ntt.lms.xmo.MessageData;
import jp.co.ntt.lms.lo.LoConstant;
import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.lo.Catalog.CatalogLoData;
import jp.co.ntt.lms.lo.Catalog.CatalogLoListData;
import jp.co.ntt.lms.lo.Catalog.CatalogLoEnv;
import jp.co.ntt.lms.lo.LoComData;

/**
 *  カタログツールクラス
 * 
 *  このクラスはカタログツールのクラスです。
 * 
 *  @author 梅原 浩司
 *  @version 1.0
 */
public class CatalogTool extends ToolBase {
	
	/**
	 * カタログ閲覧画面を初期化する。
	 * @param request リクエストオブジェクト
	 * @param response レスポンスオブジェクト
	 * @throws Exception
	 */
	public void initCatalogPerusal(HttpServletRequest request, HttpServletResponse response)
	throws Exception 
	{
		// メッセージの取得
		String strMessage = request.getParameter("message");
		if( strMessage != null ) {
			// Unicode → Shift_JIS変換
			strMessage = new String( strMessage.getBytes("8859_1"), "UTF-8" );
			strMessage = java.net.URLDecoder.decode(strMessage,"UTF-8");
			//strMessage = new String( strMessage.getBytes("8859_1"), "Windows-31J" );
		}
		// リクエストパラメータの取得
		// LOID
		String strLOID = request.getParameter( "LOID" );
		String strLoType = request.getParameter( "LOType" );

		if( strLOID == null || strLoType == null ) {
			throw new Exception( getContextString("STR_PARAM_ERR") );
		}

		// セッションからユーザIDの取得
		String strUserID = (String)request.getSession().getAttribute( "userId" );

		if( strUserID == null ) {
			// ログインしていない場合はログイン画面にリダイレクトする
			response.sendRedirect( "../../xmo/Com/ComLoginRedirector.vm" );
			return;
		}
		
		context.put("strMessage", strMessage);
		context.put("strLOID", strLOID);
		context.put("strLoType", strLoType);
		context.put("strUserID", strUserID);
	}

	/**
	 * カタログ情報を取得する。
	 * @param request リクエストオブジェクト
	 * @param response レスポンスオブジェクト
	 * @return CatalogLoListData[] カタログ一覧
	 * @throws Exception
	 */
	public CatalogLoListData[] getCatalogInfo(HttpServletRequest request, HttpServletResponse response)
	throws Exception
	{
		//-------------------------------------------------------------------------
		// カタログのタイトルと説明を取得する
		//
		//-------------------------------------------------------------------------
		String strCataLogTitle = "";				//カタログのタイトル
		String strCataLOExplanation = "";			//カタログの説明

		// LOXMOを使用し、LOテーブルからカタログのタイトルと説明を取得します。
		LoClient objLo = new LoClient();
		// 検索条件を設定
		String strLOID = getContextString("strLOID");
		objLo.setWhereLoID(strLOID);
		if( !objLo.select() ) {
			// 検索がうまくいかなかった場合
			if( objLo.isErr() ) {
				// エラーの場合
				response.sendRedirect( objLo.getURL() );
			}
			else {
				String strMsg =  objLo.getMessage();
				response.sendRedirect( CommonFunction.getParamErrURL( strMsg, null, true ) );
			}
		}

		// LOデータの取得
		if( objLo.next() ) {
			//カタログのタイトル
			strCataLogTitle = objLo.getLoTytle();
			//カタログの説明
			strCataLOExplanation = objLo.getLoExplanation();
		}
		else {
			//LO名が存在しない場合エラーを出力する
			String strMsg =  getContextString("M042010");
			response.sendRedirect( CommonFunction.getParamErrURL( strMsg, null, true ) );
		}

		//-------------------------------------------------------------------------
		// LOリストの各LOのLOID、タイトル、及びLOの説明を取得する
		//
		//-------------------------------------------------------------------------
		String strCatalogListLOID = "";				//カタログリスト内のLOのLOID
		Vector vecLoListLOID = new Vector();		//LOIDリスト
		Vector vecLoListTitle = new Vector();		//LOタイトルリスト
		Vector vecLoListExplanation = new Vector();	//LOの説明リスト
		Vector vecLoListType = new Vector();		//LOリスト申請種別配列
		Vector vecLoListLink = new Vector();		//LOタイトルリンクリスト
		Vector vecLoTypeList = new Vector();		// LOタイプリスト
//		 ADD 2005/02/14 START Katsuhiko Kagami(UNITEC) [LO購入]
		Vector vecLoBuyStatus = new Vector();		// LO購入ステータス
//	 ADD 2005/02/14 END Katsuhiko Kagami(UNITEC) [LO購入]
		String strLoTreeRoot = "lotreeroot";		// LOのツリールートを表します。
		int loListCount = 0;						// LOリスト数

		//申請種別フラグ
		String strAttendPossible = "1";				//受講可能
		String strAttendApply = "2";				//受講申請
		String strApplySettled = "3";				//申請済み

		// Loサーバ名を取得する
		Environment objEnv = new Environment();
		String strLoServerName = objEnv.getLoServerName();

		//カタログの個別情報取得
		LoTopClient objLoTop = new LoTopClient( strLoServerName, getContextString("strLoType") );
		// 検索処理
		// カタログLOは、LOID=RealLOID(コンテナと同様)のため、ここではRealLOIDを
		// セットするのではなく、LOIDをセットする。
		if( !objLoTop.getData(strLOID) ) {

			// 検索がうまくいかなかった場合
			MessageData objMessage = objLoTop.getMessageData();
			response.sendRedirect( objMessage.getURL() );
		}

		// 検索がうまくいった場合はデータを取得する
		LoComData objData = objLoTop.getDataInfo(0);

		//カタログ情報を取得する
		CatalogLoData objGetLoData = (CatalogLoData)objData;

		//カタログリストデータを取得する
		CatalogLoListData[] objLoDataList = objGetLoData.getLoList();

		// 20050210 ADD Start s-mori
		// LOリストをセット
		loListCount = objLoDataList.length;
		// 20050210 ADD End

		//LOリスト０件チェック
		if (objLoDataList.length == 0)
		{
			//処理無し
			return objLoDataList;
		}
		else
		{
			for(int i=0; i < objLoDataList.length ; i++){

				//リスト内のLOIDを取得する
				strCatalogListLOID = objLoDataList[i].getCatalogListLOID();
				//パラメータの設定をクリアする
				objLo.clear();
				// LOIDを検索条件に設定する
				objLo.setWhereLoID(strCatalogListLOID);
				if( !objLo.select() ) {
					// 検索がうまくいかなかった場合
					if( objLo.isErr() ) {
						// エラーの場合
						response.sendRedirect( objLo.getURL() );
					}
					else {
						String strMsg =  objLo.getMessage();
						response.sendRedirect( CommonFunction.getParamErrURL( strMsg, null, true ) );
					}
				}
				// LOのLOID、タイトル、説明、LOタイプを取得する
				if( objLo.next() ) {
					vecLoListLOID.add(strCatalogListLOID);
					vecLoListTitle.add(objLo.getLoTytle());
					vecLoListExplanation.add(objLo.getLoExplanation());
					// LOタイプ取得
					vecLoTypeList.add(objLo.getLoType());
//					 ADD 2005/02/14 START Katsuhiko Kagami(UNITEC) [LO購入]
					String strBuyStatus = LoExtendTable.LOEXTEND_NOREQUIRE_BUY;
					if (objLo.selectLoExtend(strCatalogListLOID)) {
						// LoExtendがあれば取得する
						if (objLo.isExistLoExtend()) {
							// 購入ステータスの更新
							strBuyStatus = CommonFunction.null2blank(objLo.getLoExtendRecord().getBuy());
							//if( strBuyStatus != "" )
							//{
							//	strBuyStatus = CommonFunction.encodeSJIS(strBuyStatus);
							//}
						}
					}
					vecLoBuyStatus.add(strBuyStatus);
//	 ADD 2005/02/14 END Katsuhiko Kagami(UNITEC) [LO購入]
				}
				else {
					//LO名が存在しない場合エラーを出力する
					String strMsg =  getContextString("M042010");
					response.sendRedirect( CommonFunction.getParamErrURL( strMsg, null, true ) );
				}
			}

			//-------------------------------------------------------------------------
			// XMSBaseを使用して、ログインユーザに学習アサインされているLOリストを取得する
			//
			//-------------------------------------------------------------------------
			XMSBaseClient objBase = new XMSBaseClient();
			String strUserID = getContextString("strUserID");
			if( !objBase.searchRootLoList( strUserID, XMSBaseClient.LEARN_TYPE ) ) {
				throw new Exception( objBase.getMessage() );
			}
			LoData[] objRootLo = objBase.getRootLoList();

			// LOIDリストを取得する
			Vector vecAuthList = new Vector();
			for( int i = 0; i < objRootLo.length; i++ ) {
				vecAuthList.add( objRootLo[i].getLoID() );
			}

			//-------------------------------------------------------------------------
			// カタログのLOリスト分ループさせ、各LOがログインユーザに学習アサイン
			// されているかチェックする
			//-------------------------------------------------------------------------
			String strLoLinkPath = "";
			for(int i=0; i<vecLoListLOID.size() ; i++)
			{
				// LOのパスを取得します。
				LoRelationClient objLoRelation = new LoRelationClient();
				String strLoListLOID = (String)vecLoListLOID.get(i);
				// LOタイプを取得します。
				String loType = (String)vecLoTypeList.get(i);

				if( !objLoRelation.searchPath(strLoListLOID) ) {
					// パス検索がうまくいかなかった場合
					throw new Exception( objLoRelation.getMessage() );
				}

				//-------------------------------------------------------------------------
				//スーパユーザの場合
				if ( strUserID.equals( XMSBaseClient.ROOT_USER ) )
				{
					//LOがログインユーザに学習アサインされているかチェックする。
					while( objLoRelation.next() ) {
						// LOのパスを配列として取得する
						String[] strPath = objLoRelation.getPath();
						StringBuffer strbPath = new StringBuffer();
						for( int j = 0; j < strPath.length; j++ ) {
							strbPath.append(strPath[j]);
							// 閲覧対象LOがコンテナの場合、デリミタとして「,」を使用する。
							if ( j == strPath.length -2 && loType.equals(LoConstant.LO_TYPE_CONTAINER))
							{
								strbPath.append( "," );
							}
							else if ( j == strPath.length -1 )
							{
								//処理無し
							}
							else
							{
								strbPath.append( "/" );
							}
						}
						strLoLinkPath = strbPath.toString();
						//スーパユーザの場合は、全て受講可能とする
						vecLoListType.add(strAttendPossible);

						vecLoListLink.add("../../xmo/Base/frameset_g.vm?treepath=" + URLEncoder.encode(strLoLinkPath, "UTF-8" ) + "&ini_menu=&tree_view_type=2&search=on");
					}
				}

				//-------------------------------------------------------------------------
				//スーパユーザ以外の場合
				else
				{
					//LOがログインユーザに学習アサインされているかチェックする。
					boolean isAssign = false;	//学習アサインフラグ
					while( objLoRelation.next() ) {
						isAssign = false;
						// LOのパスを配列として取得する
						String[] strPath = objLoRelation.getPath();
						for( int j = 0; j < strPath.length; j++ ) {
							// LOのパスに学習アサインされているLOIDが含まれていたら、
							// 学習アサインされているとみなす。
							if( vecAuthList.contains( strPath[j] ) ) {
								// アサインフラグをtrueにする
								isAssign = true;
								break;
							}
						}

						//学習アサインされていた場合
						if( isAssign ) {
							//学習アサインされていたらそのLOのパスを"/"区切りで作成する	。
							StringBuffer strbPath = new StringBuffer();
							for( int j = 0; j < strPath.length; j++ )
							{
								if ( j == 0 )
								{
									strbPath.append(strLoTreeRoot);
								}
								else
								{
										strbPath.append(strPath[j]);
								}
								// 閲覧対象LOがコンテナの場合、デリミタとして「,」を使用する。
								if ( j == strPath.length -2 && loType.equals(LoConstant.LO_TYPE_CONTAINER))
								{
									strbPath.append( "," );
								}
								else if ( j == strPath.length -1 )
								{
									//ログインユーザのroot直下に表示されるLOが、あるコンテナ配下のLOであった場合、
									//そのLOの親LOのLOIDは省き、以下のようなパスを作成する。
									//"lotreeroot,LOID"
									//また、以下の対応をしないと、"lotreeroot/親LOID,LOID"のようなパスになってしまうため、
									//ハイライト表示させると、アサインされていないLOまでもが第2ペインに表示されてしまう。
									if( vecAuthList.contains( strPath[j] ) )
									{
										strbPath.delete(0,strbPath.length());
										// 閲覧対象LOがコンテナの場合、デリミタとして「,」を使用する。
										if (loType.equals(LoConstant.LO_TYPE_CONTAINER)) {
										strbPath.append(strLoTreeRoot + "," + strPath[j]);
										} else {
										// 閲覧対象LOがコンテナ以外の場合はデリミタを「/」とする。
											strbPath.append(strLoTreeRoot + "/" + strPath[j]);
										}
									}
								}
								else
								{
									strbPath.append( "/" );
								}
							}
							strLoLinkPath = strbPath.toString();
							break;
						}
					}

					//---------------------------------------------------------------------
					// 申請種別チェックを行い、申請種別フラグを取得する
					// 種別    ：フラグ	：条件
					// 受講可能："1"	：LOが学習アサインされている場合のみ
					// 受講申請："2"	：LOが学習アサインされていない、かつクッキーがない場合のみ
					// 申請済み："3"	：LOが学習アサインされていない、かつクッキーがある場合のみ
					//---------------------------------------------------------------------
					//LOが学習アサインされている場合
					if (isAssign)
					{
						//受講可能
						vecLoListType.add(strAttendPossible);
						
						vecLoListLink.add("../../xmo/Base/frameset_g.vm?treepath=" + URLEncoder.encode(strLoLinkPath, "UTF-8" ) + "&ini_menu=&tree_view_type=2&search=on");	
						
					}
					//LOが学習アサインされていない場合
					else
					{
						// クッキーを取得する
						Cookie[] cookies = request.getCookies();
						// クッキーが未設定の場合
						if( cookies == null ) {
							// 受講申請
							vecLoListType.add(strAttendApply);
							vecLoListLink.add("");
						}
						else {
							boolean isExistCookie = false;						//クッキーフラグ
							String strCookieName = strLoListLOID + strUserID;	//クッキー名称
							for( int j = 0; j < cookies.length; j++ )
							{
								Cookie cookie = cookies[j];
								// クッキーを取得し、"LOID+USERID"のクッキー名称が存在するかチェックする。
								if ( cookie.getName().equals( strCookieName ) )
								{
									isExistCookie = true;
									break;
								}
							}

							// クッキーが存在する場合
							if ( isExistCookie )
							{
								//申請済み
								vecLoListType.add(strApplySettled);
								vecLoListLink.add("");
							}
							// クッキーが存在しない場合
							else
							{
								//受講申請
								vecLoListType.add(strAttendApply);
								vecLoListLink.add("");
							}
						}
					}
				}
			}

			// 承認依頼処理URLの取得
			CatalogLoEnv objCatalogLoEnv = new CatalogLoEnv();
			String strAssignRpURL = objCatalogLoEnv.getAssign_rq_mail_url();
			
			// 呼び出しvmへ渡す
			context.put("strAssignRpURL", strAssignRpURL);
			context.put("strCataLogTitle", strCataLogTitle);
			context.put("strCataLOExplanation", strCataLOExplanation);
			context.put("vecLoListLOID", vecLoListLOID);
			context.put("vecLoListTitle", vecLoListTitle);
			context.put("vecLoListExplanation", vecLoListExplanation);
			context.put("vecLoListType", vecLoListType);
			context.put("vecLoListLink", vecLoListLink);
			context.put("vecLoBuyStatus", vecLoBuyStatus);
			context.put("strAttendPossible", strAttendPossible);
			context.put("strAttendApply", strAttendApply);
			context.put("strApplySettled", strApplySettled);
			
			// ADD 2005/02/24 START Katsuhiko Kagami(UNITEC)
			context.put("strREQNOBUY", LoExtendTable.LOEXTEND_NOREQUIRE_BUY);
			context.put("strREQBUY", LoExtendTable.LOEXTEND_REQUIRE_BUY);
			// ADD 2005/02/24 END Katsuhiko Kagami(UNITEC)

			return objLoDataList;
		}
	}
}