/**
 * 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.camel.component.box;

import java.util.Map;

import com.box.boxjavalibv2.BoxClient;
import com.box.boxjavalibv2.resourcemanagers.IBoxResourceManager;
import org.apache.camel.Consumer;
import org.apache.camel.Processor;
import org.apache.camel.Producer;
import org.apache.camel.component.box.internal.BoxApiCollection;
import org.apache.camel.component.box.internal.BoxApiName;
import org.apache.camel.component.box.internal.BoxClientHelper;
import org.apache.camel.component.box.internal.BoxConstants;
import org.apache.camel.component.box.internal.BoxPropertiesHelper;
import org.apache.camel.component.box.internal.CachedBoxClient;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.component.AbstractApiEndpoint;
import org.apache.camel.util.component.ApiMethod;
import org.apache.camel.util.component.ApiMethodPropertiesHelper;

/**
 * Represents a Box endpoint.
 */
@UriEndpoint(scheme = "box", consumerClass = BoxConsumer.class, consumerPrefix = "consumer")
public class BoxEndpoint extends AbstractApiEndpoint<BoxApiName, BoxConfiguration> {

    private static final String SHARED_LINK_PROPERTY = "sharedLink";
    private static final String SHARED_PASSWORD_PROPERTY = "sharedPassword";

    // cached client
    private CachedBoxClient cachedBoxClient;

    // proxy manager
    private IBoxResourceManager apiProxy;

    // configuration values for shared links
    private String sharedLink;
    private String sharedPassword;

    private boolean boxClientShared;

    public BoxEndpoint(String uri, BoxComponent component,
                         BoxApiName apiName, String methodName, BoxConfiguration endpointConfiguration) {
        super(uri, component, apiName, methodName, BoxApiCollection.getCollection().getHelper(apiName), endpointConfiguration);
    }

    public Producer createProducer() throws Exception {
        // validate producer APIs
        if (getApiName() == BoxApiName.POLL_EVENTS) {
            throw new IllegalArgumentException("Producer endpoints do not support endpoint prefix "
                + BoxApiName.POLL_EVENTS.getName());
        }
        return new BoxProducer(this);
    }

    public Consumer createConsumer(Processor processor) throws Exception {
        // make sure inBody is not set for consumers
        if (inBody != null) {
            throw new IllegalArgumentException("Option inBody is not supported for consumer endpoint");
        }

        // validate consumer APIs
        if (getApiName() != BoxApiName.POLL_EVENTS) {
            throw new IllegalArgumentException("Consumer endpoint only supports endpoint prefix "
                + BoxApiName.POLL_EVENTS.getName());
        }
        final BoxConsumer consumer = new BoxConsumer(this, processor);
        // also set consumer.* properties
        configureConsumer(consumer);
        return consumer;
    }

    @Override
    protected ApiMethodPropertiesHelper<BoxConfiguration> getPropertiesHelper() {
        return BoxPropertiesHelper.getHelper();
    }

    protected String getThreadProfileName() {
        return BoxConstants.THREAD_PROFILE_NAME;
    }

    @Override
    protected void afterConfigureProperties() {
        // create client eagerly, a good way to validate configuration
        createBoxClient();

        this.sharedLink = configuration.getSharedLink();
        this.sharedPassword = configuration.getSharedPassword();

        // validate shared endpoints
        switch (getApiName()) {
        case SHARED_COMMENTS:
        case SHARED_FILES:
        case SHARED_FOLDERS:
        case SHARED_ITEMS:
            if (ObjectHelper.isEmpty(sharedLink)) {
                log.warn("Header properties sharedLink and sharedPassword MUST be provided for endpoint {}",
                    getEndpointUri());
            }
            break;
        default:
        }
    }

    private void createBoxClient() {
        final BoxComponent component = getComponent();
        this.boxClientShared = configuration.equals(getComponent().getConfiguration());
        if (boxClientShared) {
            // get shared singleton client from Component
            cachedBoxClient = component.getBoxClient();
        } else {
            cachedBoxClient = BoxClientHelper.createBoxClient(configuration);
        }
    }

    @Override
    public BoxComponent getComponent() {
        return (BoxComponent) super.getComponent();
    }

    @Override
    public void interceptProperties(Map<String, Object> properties) {
        // set shared link and password from configuration if not set as header properties
        if (!properties.containsKey(SHARED_LINK_PROPERTY) && !ObjectHelper.isEmpty(sharedLink)) {
            properties.put(SHARED_LINK_PROPERTY, sharedLink);
        }
        if (!properties.containsKey(SHARED_PASSWORD_PROPERTY) && !ObjectHelper.isEmpty(sharedPassword)) {
            properties.put(SHARED_PASSWORD_PROPERTY, sharedPassword);
        }
    }

    @Override
    public Object getApiProxy(ApiMethod method, Map<String, Object> args) {
        if (apiProxy == null) {
            // create API proxy lazily
            createApiProxy(args);
        }
        return apiProxy;
    }

    private void createApiProxy(Map<String, Object> args) {

        // get shared link and password from args
        final String sharedLink = (String) args.get("sharedLink");
        final String sharedPassword = (String) args.get("sharedPassword");

        switch (apiName) {
        case SHARED_COMMENTS:
        case SHARED_FILES:
        case SHARED_FOLDERS:
        case SHARED_ITEMS:
            if (ObjectHelper.isEmpty(sharedLink)) {
                throw new IllegalArgumentException("Missing required property sharedLink");
            }
        default:
        }

        final BoxClient boxClient = cachedBoxClient.getBoxClient();
        switch (apiName) {
        case COLLABORATIONS:
            apiProxy = boxClient.getCollaborationsManager();
            break;
        case COMMENTS:
            apiProxy = boxClient.getCommentsManager();
            break;
        case EVENTS:
            apiProxy = boxClient.getEventsManager();
            break;
        case FILES:
            apiProxy = boxClient.getFilesManager();
            break;
        case FOLDERS:
            apiProxy = boxClient.getFoldersManager();
            break;
        case GROUPS:
            apiProxy = boxClient.getGroupsManager();
            break;
        case SEARCH:
            apiProxy = boxClient.getSearchManager();
            break;
        case SHARED_FILES:
            apiProxy = boxClient.getSharedFilesManager(sharedLink, sharedPassword);
            break;
        case SHARED_FOLDERS:
            apiProxy = boxClient.getSharedFoldersManager(sharedLink, sharedPassword);
            break;
        case SHARED_COMMENTS:
            apiProxy = boxClient.getSharedCommentsManager(sharedLink, sharedPassword);
            break;
        case SHARED_ITEMS:
            apiProxy = boxClient.getSharedItemsManager(sharedLink, sharedPassword);
            break;
        case USERS:
            apiProxy = boxClient.getUsersManager();
            break;
        default:
        }
    }

    @Override
    protected void doStart() throws Exception {
        BoxClientHelper.getOAuthToken(configuration, cachedBoxClient);
    }

    @Override
    protected void doStop() throws Exception {
        try {
            if (!boxClientShared) {
                // while there is no way to suspend BoxClient, we can close idle connections to be nice
                BoxClientHelper.closeIdleConnections(cachedBoxClient);
            }
        } finally {
            super.doStop();
        }
    }

    @Override
    public void doShutdown() throws Exception {
        try {
            // cleanup if BoxClient is not shared
            if (!boxClientShared) {
                BoxClientHelper.shutdownBoxClient(configuration, cachedBoxClient);
            }
        } finally {
            cachedBoxClient = null;
            super.doShutdown();
        }
    }

    public CachedBoxClient getBoxClient() {
        return cachedBoxClient;
    }
}
