/*
* Copyright (C) 2005-2017 ManyDesigns srl.  All rights reserved.
* http://www.manydesigns.com/
*
* Unless you have purchased a commercial license agreement from ManyDesigns srl,
* the following license terms apply:
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as published by
* the Free Software Foundation.
*
* There are special exceptions to the terms and conditions of the GPL
* as it is applied to this software. View the full text of the
* exception in file OPEN-SOURCE-LICENSE.txt in the directory of this
* software distribution.
*
* This program is distributed WITHOUT ANY WARRANTY; and without the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
* or write to:
* Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330,
* Boston, MA  02111-1307  USA
*
*/

package com.manydesigns.portofino.menu;

import com.manydesigns.elements.ElementsThreadLocals;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Paolo Predonzani     - paolo.predonzani@manydesigns.com
 * @author Angelo Lupo          - angelo.lupo@manydesigns.com
 * @author Giampiero Granatella - giampiero.granatella@manydesigns.com
 * @author Alessio Stalla       - alessio.stalla@manydesigns.com
 */
public class SimpleMenuAppender implements MenuAppender {
    public static final String copyright =
            "Copyright (C) 2005-2017 ManyDesigns srl";

    public static final Logger logger = LoggerFactory.getLogger(SimpleMenuAppender.class);

    public final String targetMenuGroupId;
    public final String id;
    public final String icon;
    public final String labelKey;
    public final String link;
    public final double order;

    protected SimpleMenuAppender(String targetMenuGroupId, String id, String icon, String labelKey, String link, double order) {
        this.targetMenuGroupId = targetMenuGroupId;
        this.id = id;
        this.icon = icon;
        this.labelKey = labelKey;
        this.link = link;
        this.order = order;
    }

    public static SimpleMenuAppender group(
            String id, @Nullable String icon, String labelKey, double order) {
        return new SimpleMenuAppender(null, id, icon, labelKey, null, order);
    }

    public static SimpleMenuAppender link(
            String id, @Nullable String icon, String labelKey, String link, double order) {
        return new SimpleMenuAppender(null, id, icon, labelKey, link, order);
    }

    public static SimpleMenuAppender link(
            String targetMenuGroupId, String id, @Nullable String icon, String labelKey, String link, double order) {
        return new SimpleMenuAppender(targetMenuGroupId, id, icon, labelKey, link, order);
    }

    @Override
    public void append(Menu menu) {
        String label = ElementsThreadLocals.getText(labelKey);
        if(this.link == null) {
            appendMenuGroup(menu, label);
        } else {
            appendMenuLink(menu, label);
        }
    }

    protected void appendMenuGroup(Menu menu, String label) {
        MenuGroup group = new MenuGroup(id, icon, label, order);
        menu.items.add(group);
    }

    protected void appendMenuLink(Menu menu, String label) {
        MenuLink link = new MenuLink(id, icon, label, this.link, order);
        MenuGroup targetGroup = null;
        if(targetMenuGroupId != null) {
            for(MenuItem item : menu.items) {
                if(targetMenuGroupId.equals(item.id)) {
                    if(item instanceof MenuGroup) {
                        targetGroup = (MenuGroup) item;
                        break;
                    } else {
                        logger.warn("Could not add menu link " + id + " to " + targetMenuGroupId + " because it is a link, not a menu group");
                    }
                }
            }
            if(targetGroup == null) {
                logger.warn("Could not find menu group " + targetMenuGroupId);
            }
        }
        if(targetGroup == null) {
            menu.items.add(link);
        } else {
            targetGroup.menuLinks.add(link);
        }
    }
}
