/*
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package com.celements.navigation.cmd;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xwiki.context.Execution;
import org.xwiki.model.reference.DocumentReference;

import com.celements.web.service.IWebUtilsService;
import com.celements.web.utils.IWebUtils;
import com.celements.web.utils.WebUtils;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.objects.BaseObject;
import com.xpn.xwiki.web.Utils;

public class MultilingualMenuNameCommand {

  public static final String CELEMENTS_MENU_NAME = "Celements2.MenuName";
  public static final String MENU_NAME_CLASS_SPACE = "Celements2";
  public static final String MENU_NAME_CLASS_DOC = "MenuName";

  public DocumentReference getMenuNameClassRef() {
    return new DocumentReference(getContext().getDatabase(), MENU_NAME_CLASS_SPACE,
        MENU_NAME_CLASS_DOC);
  }

  private static Log mLogger = LogFactory.getFactory().getInstance(
      MultilingualMenuNameCommand.class);

  private IWebUtils webUtils = WebUtils.getInstance();

  public MultilingualMenuNameCommand() {
  }

  public String getMultilingualMenuName(String fullName, String language,
      XWikiContext context) {
    try {
      return getMenuNameFromBaseObject(fullName, getMenuNameBaseObject(fullName,
          language, context), false, context);
    } catch (XWikiException exp) {
      mLogger.error(exp);
      return "";
    }
  }

  public String getMultilingualMenuName(com.xpn.xwiki.api.Object menuItem,
      String language, XWikiContext context) {
    if (menuItem != null) {
      return getMultilingualMenuName(menuItem.getXWikiObject(), language, false,
        context);
    } else {
      return "";
    }
  }

  public String getMultilingualMenuName(BaseObject menuItem, String language,
      XWikiContext context) {
    return getMultilingualMenuName(menuItem, language, false, context);
  }

  public String getMultilingualMenuName(BaseObject menuItem, String language,
      boolean allowEmptyMenuNames, XWikiContext context) {
    //TODO write tests
    String menuName = "";
    if (menuItem != null) {
      String docFullName = menuItem.getName();
      try {
        menuName = getMenuNameFromBaseObject(docFullName, getMenuNameBaseObject(
            docFullName, language, context), allowEmptyMenuNames, context);
      } catch (XWikiException e) {
        mLogger.error(e);
      }
    }
    return menuName;
  }

  private String getMenuNameFromBaseObject(String fullName, BaseObject menuNameObj,
      boolean allowEmptyMenuNames, XWikiContext context) throws XWikiException {
    String menuName = "";
    if (menuNameObj != null) {
      menuName = menuNameObj.getStringValue("menu_name");
    }
    // if menuName is empty give back the DocURLname
    if ((!allowEmptyMenuNames) && "".equals(menuName)) {
      menuName = fullName.substring(fullName.indexOf('.') + 1);
    }
    return menuName;
  }

  public String getMultilingualMenuNameOnly(String fullName, String language,
      boolean allowEmptyMenuNames, XWikiContext context) {
    try {
      return getMenuNameFromBaseObject(fullName, getMenuNameBaseObject(fullName,
          language, context), allowEmptyMenuNames, context);
    } catch (XWikiException exp) {
      mLogger.error("Failed to get MenuName for [" + fullName + "].", exp);
      if (allowEmptyMenuNames) {
        return "";
      } else {
        return fullName.split("\\.")[1];
      }
    }
  }

  /**
   * 
   * @param fullName
   * @param language
   * @param context
   * @return
   * @throws XWikiException
   * 
   * @deprecated since 2.14.0 use getMenuNameBaseObject instead
   */
  @Deprecated
  public BaseObject getMultilingualMenuNameOnly(String fullName, String language,
      XWikiContext context) throws XWikiException {
    BaseObject menuNameObj = getMenuNameBaseObject(fullName, language, context);
    return menuNameObj;
  }

  public BaseObject getMenuNameBaseObject(String fullName, String language,
      XWikiContext context) throws XWikiException {
    XWikiDocument menuItemDoc = context.getWiki().getDocument(fullName, context);
    BaseObject menuNameObj = null;
    if (context.getWiki().isMultiLingual(context) && (menuItemDoc != null)
        && (menuItemDoc.getObject(CELEMENTS_MENU_NAME) != null)) {
      menuNameObj = menuItemDoc.getObject(CELEMENTS_MENU_NAME, "lang", language);
      if ((menuNameObj == null) || "".equals(menuNameObj.getStringValue("menu_name"))) {
        String spaceDefaultLanguage = context.getWiki().getSpacePreference(
            "default_language", menuItemDoc.getDocumentReference().getLastSpaceReference(
                ).getName(), "", context);
        menuNameObj = menuItemDoc.getObject(CELEMENTS_MENU_NAME, "lang",
            spaceDefaultLanguage, false);
      }
    }
    return menuNameObj;
  }

  public String addNavImageStyle(String fullName, String language, XWikiContext context
      ) throws XWikiException {
    String menuItemHTML = "";
    BaseObject menuNameObj = getMenuNameBaseObject(fullName, language, context);
    if (menuNameObj != null) {
      String attURL = webUtils.getAttachmentURL(menuNameObj.getStringValue(
          "image"), context);
      if ((attURL != null) && (!"".equals(attURL))) {
        menuItemHTML += " style=\"background-image:url(" + attURL + ")\"";
      }
    }
    return menuItemHTML.trim();
  }

  public String addToolTip(String fullName, String language, XWikiContext context
      ) throws XWikiException {
    BaseObject menuNameObj = getMenuNameBaseObject(fullName, language, context);
    if (menuNameObj != null) {
      String tooltip = menuNameObj.getStringValue("tooltip");
      if ((tooltip != null) && (!"".equals(tooltip))) {
        return "title=\"" + tooltip + "\"";
      }
    }
    return "";
  }

  void inject_webUtils(IWebUtils webUtils) {
    this.webUtils = webUtils;
  }

  private XWikiContext getContext() {
    return (XWikiContext)Utils.getComponent(Execution.class).getContext().getProperty(
        "xwikicontext");
  }

  private IWebUtilsService getWebUtilsService() {
    return Utils.getComponent(IWebUtilsService.class);
  }

}

@@ -926,16 +926,60 @@
 n.cmd;%0A%0A
+import org.apache.commons.lang.StringUtils;%0A
 import o
@@ -3806,25 +3806,35 @@
 mes) && 
-%22%22.equals
+StringUtils.isEmpty
 (menuNam

fix getMenuNameFromBaseOject for getStringValue returning null