/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.syncope.client.console.topology;

import org.apache.commons.lang3.StringUtils;
import org.apache.syncope.client.console.rest.ConnectorRestClient;
import org.apache.syncope.client.console.topology.TopologyNode.Kind;
import org.apache.syncope.client.console.topology.TopologyTogglePanel.UpdateEvent;
import org.apache.syncope.client.ui.commons.Constants;
import org.apache.syncope.common.lib.to.ConnInstanceTO;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.IAjaxIndicatorAware;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;

public class TopologyNodePanel extends Panel implements IAjaxIndicatorAware {

    private static final long serialVersionUID = -8775095410207013913L;

    private final Label label;

    private final TopologyNode node;

    protected enum Status {
        ACTIVE,
        INACTIVE

    }

    public TopologyNodePanel(final String id, final TopologyNode node, final boolean errored) {
        super(id);
        this.node = node;

        label = new Label("label", StringUtils.abbreviate(node.getDisplayName(), 10));
        label.setOutputMarkupId(true);
        add(label);

        String title;
        switch (node.getKind()) {
            case SYNCOPE:
                title = "";
                add(new AttributeAppender("class", "topology_root", " "));
                break;

            case CONNECTOR_SERVER:
                title = node.getDisplayName();
                add(new AttributeAppender("class", "topology_cs", " "));
                break;

            case FS_PATH:
                title = node.getDisplayName();
                add(new AttributeAppender("class", "topology_cs", " "));
                break;

            case CONNECTOR:
                title = (StringUtils.isBlank(node.getConnectionDisplayName())
                        ? "" : node.getConnectionDisplayName() + ':') + node.getDisplayName();
                if (errored) {
                    add(new AttributeAppender("class", "topology_conn_errored", " "));
                } else {
                    add(new AttributeAppender("class", "topology_conn", " "));
                }
                break;

            case RESOURCE:
            default:
                title = node.getDisplayName().length() > 14 ? node.getDisplayName() : "";
                add(new AttributeAppender("class", "topology_res", " "));
        }

        if (StringUtils.isNotEmpty(title)) {
            add(AttributeModifier.append("data-original-title", title));
        }

        this.setMarkupId(node.getDisplayName());
    }

    @Override
    public String getAjaxIndicatorMarkupId() {
        return Constants.VEIL_INDICATOR_MARKUP_ID;
    }

    @Override
    public void onEvent(final IEvent<?> event) {
        if (event.getPayload() instanceof UpdateEvent) {
            UpdateEvent updateEvent = UpdateEvent.class.cast(event.getPayload());
            String key = updateEvent.getKey();

            if (node.getKind() == Kind.CONNECTOR && key.equalsIgnoreCase(node.getKey())) {
                ConnInstanceTO conn = ConnectorRestClient.read(key);

                // [SYNCOPE-1233]
                String displayName = StringUtils.isBlank(conn.getDisplayName())
                        ? conn.getBundleName() : conn.getDisplayName();

                label.setDefaultModelObject(StringUtils.abbreviate(displayName, 10));
                updateEvent.getTarget().add(label);
                node.setDisplayName(displayName);
            }
        }
    }
}
