/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	メニューカスタマイズ画面アクションクラス
//
//		変更履歴
//			2005.02.20  新規作成  梅原 浩司
//
//	機能
//
//	このクラスはメニューカスタマイズ画面のアクションクラスです。
//
////////////////////////////////////////////////////////////////

package jp.co.ntt.lms.xmf.actions;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import jp.co.ntt.lms.xmf.CustomMenuDef;
import jp.co.ntt.lms.xmf.CustomMenuManager;
import jp.co.ntt.lms.xmf.beans.CustomMenuBean;
import jp.co.ntt.lms.xmf.common.CommonFunction;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 *  メニューカスタマイズ画面アクションクラス
 * 
 *  @author 梅原 浩司
 *  @version 1.0
 */
public class CustomizeMenuAction extends Action
{
	private static final String ERROR_MSG_DEF = "エラーです。画面を閉じてからもう一度操作して下さい。"; 
	/**
	 * executeメソッド
	 * 
	 * @param ActionMapping このアクションが選択されたときに使用されたActionMapping
	 * @param ActionForm 入力フォーム
	 * @param HttpServletRequest HTTPリクエスト
	 * @param HttpServletResponse HTTPレスポンス
	 * @return ActionForward アクションフォワード
	 * @throws Exception 
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		// カスタムメニューオブジェクト取得
		ServletContext cntx = getServlet().getServletContext();
		CustomMenuDef menuDef = (CustomMenuDef)request.getSession().getAttribute("menuDef");

		// リクエストパラメータ取得
		String strTitle = request.getParameter("title");
		String strDispTitle = request.getParameter("disptitle");
		String strKey = request.getParameter("key");
		boolean blnUnvisible = (request.getParameter("unvisible") != null);
		String strSelectID = request.getParameter("selectID");
		boolean blnSaveOK = false;
		
		// エンコード処理
		//if (strTitle != null && !strTitle.equals("")) strTitle = CommonFunction.encodeSJIS(strTitle);
		//if (strDispTitle != null && !strDispTitle.equals("")) strDispTitle = CommonFunction.encodeSJIS(strDispTitle);
		//if (strKey != null && !strKey.equals("")) strKey = CommonFunction.encodeSJIS(strKey);
			
		// 各アクション処理
		if (request.getParameter("add") != null)
		{
			if (menuDef == null) return dispError(mapping, request, ERROR_MSG_DEF);
			menuDef.addCustomMenu(strTitle, strKey, strDispTitle, false);
		}
		else if (request.getParameter("addunvisible") != null)
		{
			if (menuDef == null) return dispError(mapping, request, ERROR_MSG_DEF);
			menuDef.addCustomMenu(strTitle, strKey, "", true);
		}
		else if (request.getParameter("edit") != null)
		{
			if (menuDef == null) return dispError(mapping, request, ERROR_MSG_DEF);
			menuDef.updateCustomMenu(strTitle, strKey, strDispTitle, blnUnvisible);
		}
		else if (request.getParameter("delete") != null)
		{
			if (menuDef == null) return dispError(mapping, request, ERROR_MSG_DEF);
			menuDef.deleteCustomMenu(strTitle, strKey, blnUnvisible);
		}
		else if (request.getParameter("save") != null)
		{
			if (menuDef == null) return dispError(mapping, request, ERROR_MSG_DEF);
	  		CustomMenuManager menuManager = new CustomMenuManager();
			menuManager.saveDefaultDef(cntx, menuDef);
			blnSaveOK = true;
		}
		else
		{
			// 初期表示時
			// ファイルから取得。
	  		CustomMenuManager menuManager = new CustomMenuManager();
			menuManager.loadDefaultDef(cntx);
			menuDef = menuManager.getCustomMenuDef();
			if (menuDef == null) return dispError(mapping, request, ERROR_MSG_DEF);
		}
		
		// セッションに保存
		request.getSession().setAttribute("menuDef", menuDef);
		
		// 一覧の表示
		List list = menuDef.getCustomMenuList();
		Collections.sort(list,
				new Comparator()
				{
					public int compare(Object obj1, Object obj2)
					{
						if (obj1 instanceof CustomMenuBean && obj2 instanceof CustomMenuBean)
						{
							CustomMenuBean menu1 = (CustomMenuBean)obj1;
							CustomMenuBean menu2 = (CustomMenuBean)obj2;
							if (menu1.getSelect() != null)
							{
								//select 属性が指定されている
								if (menu2.getSelect() != null)
								{
									return menu1.getSelect().compareTo(menu2.getSelect());
								}
								else
								{
									return -1;
								}
							}
							else
							{
								if (menu2.getSelect() != null)
								{
									return 1;
								}
								else
								{
									return 0;
								}
							}
						}
						return 0;
					}
				});
		
		//select属性でソートされた list を select属性をキーにして Map に詰める
		Map menudefMap = new HashMap();
		List keyList = new ArrayList();		// select属性値のリスト
		List dispList = new ArrayList();	// 対応する名前のリスト
		//select属性が指定されていないメニュー定義は "ALL" をキーとするリストにまとめる
		menudefMap.put("ALL", new ArrayList());
		keyList.add("ALL");
		dispList.add("");
		for (int i=0; i < list.size(); i++)
		{
			// 各メニュー要素のselect属性を取得
			CustomMenuBean menu = (CustomMenuBean)list.get(i);
			String select = menu.getSelect();
			// select属性値ごとにArrayList(menudefList)を作成してCustomMenuBeanを詰め、それをMap(menudefMap)に格納。
			if (select != null)
			{
				if (menudefMap.containsKey(select))
				{
					List menudefList = (List)menudefMap.get(select);
					menudefList.add(menu);
				}
				else
				{
					List menudefList = new ArrayList();
					menudefList.add(menu);
					menudefMap.put(select, menudefList);
					keyList.add(select);
					dispList.add(getSelectDispName(select));
				}
			}
			else
			{
				List menudefList = (List)menudefMap.get("ALL");
				menudefList.add(menu);
			}
		}
		
		// 選択LOについて既に設定が登録されているかどうか
		boolean blnExistSelectID = menudefMap.containsKey(strSelectID);
		
		// 選択LOが設定に未登録なら最後に追加
		if(strSelectID != null && !blnExistSelectID)
		{
			keyList.add(strSelectID);
			menudefMap.put(strSelectID, new ArrayList()); // menudefMapに空のArrayListを追加。
			dispList.add(getSelectDispName(strSelectID));
		}
		
		request.setAttribute("custom_menudef_mapkey_list", keyList);
		request.setAttribute("custom_menudef_map", menudefMap);
		request.setAttribute("custom_menudef_disp", dispList);
		request.setAttribute("selectID", strSelectID);
		if (blnSaveOK) request.setAttribute("saveok", "true");
		
		return mapping.findForward("view");
	}
	
	/**
	 * キーに対応する表示文字列を取得する。
	 * 
	 * @param String キー(ユーザID|グループID|LOID)
	 * @return 表示文字列を戻します。
	 */
	private String getSelectDispName(String key)
		throws Exception
	{
		String strDispName = "";
		if (key.startsWith("PE"))
		{
			// 人
			PeopleClient objPeople = new PeopleClient();
			objPeople.setWhereUserID(key);
			if (objPeople.select() == false) 
			{
				throw new Exception("select Method of PeopleClient Class returned false.");
			}
			if (objPeople.next())
			{
				strDispName = objPeople.getUserName();
			}
		}
		else if (key.startsWith("GR"))
		{
			// グループ
			GroupsClient objGroups = new GroupsClient();
			objGroups.setWhereGroupID(key);
			if (objGroups.select() == false)
			{
				throw new Exception("select Method of GroupsClient Class returned false.");
			}
			if (objGroups.next())
			{
				strDispName = objGroups.getGroupName();
			}
		}
		else
		{
			// LO
			LoClient objLo = new LoClient();
			objLo.setWhereLoID(key);
			if (objLo.select() == false) 
			{
				throw new Exception("select Method of LoClient Class returned false.");
			}
			if (objLo.next()) 
			{
				strDispName = objLo.getLoTytle();				//LOタイトル
			}
		}
		
		return strDispName;
	}
	
	private ActionForward dispError(ActionMapping mapping, HttpServletRequest request, String msg)
	{
		request.setAttribute("errormessage", msg);
		return mapping.findForward("view");
	}

}
