/**
 * 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.swagger;

import java.util.HashMap;
import java.util.Map;

import org.apache.camel.CamelContext;
import org.apache.camel.Processor;
import org.apache.camel.spi.RestApiProcessorFactory;
import org.apache.camel.spi.RestConfiguration;

public class SwaggerRestApiProcessorFactory implements RestApiProcessorFactory {

    @Override
    public Processor createApiProcessor(CamelContext camelContext, String contextPath, String contextIdPattern, boolean contextIdListing,
                                        RestConfiguration configuration, Map<String, Object> parameters) throws Exception {

        Map<String, Object> options = new HashMap<String, Object>(parameters);
        if (configuration.getApiProperties() != null) {
            options.putAll(configuration.getApiProperties());
        }

        // need to include host in options
        String host = (String) options.get("host");
        if (host == null) {
            host = configuration.getHost();
            int port = configuration.getPort();
            if (host != null && port > 0) {
                options.put("host", host + ":" + port);
            } else if (host != null) {
                options.put("host", host);
            } else {
                options.put("host", "localhost");
            }
        }
        // and context path is the base.path
        String path = configuration.getContextPath();
        if (path != null) {
            options.put("base.path", path);
        }

        return new RestSwaggerProcessor(contextIdPattern, contextIdListing, options);
    }
}
