/*
 * Copyright 2016 Red Hat, Inc. and/or its affiliates.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.dashbuilder.navigation.workbench;

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

import org.dashbuilder.navigation.NavItem;
import org.dashbuilder.navigation.NavItemContext;
import org.dashbuilder.navigation.impl.NavItemContextImpl;
import org.uberfire.workbench.model.ActivityResourceType;

/**
 * A {@link NavItemContext} which contains workbench related context like for instance:
 * <ul>
 *     <li>A list of permissions the nav item is tied to</li>
 *     <li>An identifier of a resource this item is referring to</li>
 * </ul>
 */
public class NavWorkbenchCtx extends NavItemContextImpl {

    public static final String PERMISSIONS = "permissions";
    public static final String RESOURCE_ID = "resourceId";
    public static final String RESOURCE_TYPE = "resourceType";

    public static NavWorkbenchCtx get(NavItem navItem) {
        return navItem != null ? new NavWorkbenchCtx(navItem.getContext()): new NavWorkbenchCtx();
    }

    public static NavWorkbenchCtx get(String navItemCtx) {
        return new NavWorkbenchCtx(navItemCtx);
    }

    public static NavWorkbenchCtx perspective(String perspectiveId) {
        NavWorkbenchCtx ctx = new NavWorkbenchCtx();
        ctx.setResourceId(perspectiveId);
        ctx.setResourceType(ActivityResourceType.PERSPECTIVE);
        return ctx;
    }

    public static NavWorkbenchCtx permission(String... permission) {
        NavWorkbenchCtx ctx = new NavWorkbenchCtx();
        for (String p : permission) {
            ctx.addPermission(p);
        }
        return ctx;
    }

    public NavWorkbenchCtx() {
        super();
    }

    public NavWorkbenchCtx(String ctx) {
        super(ctx);
    }

    public String getResourceId() {
        return super.getProperty(RESOURCE_ID);
    }

    public NavWorkbenchCtx setResourceId(String resourceId) {
        super.setProperty(RESOURCE_ID, resourceId);
        return this;
    }

    public ActivityResourceType getResourceType() {
        String type = super.getProperty(RESOURCE_TYPE);
        return type != null ? ActivityResourceType.valueOf(type.toUpperCase()) : null;
    }

    public NavWorkbenchCtx setResourceType(ActivityResourceType resourceType) {
        super.setProperty(RESOURCE_TYPE, resourceType.getName().toUpperCase());
        return this;
    }

    public NavWorkbenchCtx clearPermissions() {
        super.removeProperty(PERMISSIONS);
        return this;
    }

    public List<String> getPermissions() {
        List<String> permissionList = new ArrayList<>();
        String str = super.getProperty(PERMISSIONS);
        if (str != null) {
            for (String p : str.split(",")) {
                permissionList.add(p.trim());
            }
        }
        return permissionList;
    }

    public NavWorkbenchCtx addPermission(String permission) {
        String str = super.getProperty(PERMISSIONS);
        str = str == null ? permission : str + "," + permission;
        super.setProperty(PERMISSIONS, str);
        return this;
    }
}
