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

import java.net.URI;

import org.apache.avro.Protocol;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriParams;
import org.apache.camel.spi.UriPath;
import org.apache.commons.lang3.StringUtils;

import static org.apache.camel.component.avro.AvroConstants.AVRO_MESSAGE_NAME_SEPARATOR;

@UriParams
public class AvroConfiguration implements Cloneable {

    @UriPath @Metadata(required = true)
    private AvroTransport transport;
    @UriPath @Metadata(required = true)
    private String host;
    @UriPath @Metadata(required = true)
    private int port;
    @UriPath
    private String messageName;
    @UriParam
    private String protocolLocation;
    @UriParam
    private Protocol protocol;
    @UriParam
    private String protocolClassName;
    @UriParam
    private String uriAuthority;
    @UriParam
    private boolean reflectionProtocol;
    @UriParam
    private boolean singleParameter;

    public AvroConfiguration copy() {
        try {
            AvroConfiguration answer = (AvroConfiguration)clone();
            return answer;
        } catch (CloneNotSupportedException e) {
            throw new RuntimeCamelException(e);
        }
    }

    public void parseURI(URI uri) throws Exception {
        transport = AvroTransport.valueOf(uri.getScheme());

        setHost(uri.getHost());
        setPort(uri.getPort());
        
        if ((uri.getPath() != null)
            && (StringUtils.indexOf(uri.getPath(), AVRO_MESSAGE_NAME_SEPARATOR) != -1)) {
            String path = StringUtils.substringAfter(uri.getPath(), AVRO_MESSAGE_NAME_SEPARATOR);
            if (!path.contains(AVRO_MESSAGE_NAME_SEPARATOR)) {
                setMessageName(path);
            } else {
                throw new IllegalArgumentException("Unrecognized Avro message name: " + path + " for uri: " + uri);
            }
        }
        
        setUriAuthority(uri.getAuthority());
    }

    public String getHost() {
        return host;
    }

    /**
     * Hostname to use
     */
    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    /**
     * Port number to use
     */
    public void setPort(int port) {
        this.port = port;
    }

    public Protocol getProtocol() {
        return protocol;
    }

    /**
     * Avro protocol to use
     */
    public void setProtocol(Protocol protocol) {
        this.protocol = protocol;
    }

    public AvroTransport getTransport() {
        return transport;
    }

    /**
     * Transport to use, can be either http or netty
     */
    public void setTransport(String transport) {
        this.transport = AvroTransport.valueOf(transport);
    }

    /**
     * Transport to use, can be either http or netty
     */
    public void setTransport(AvroTransport transport) {
        this.transport = transport;
    }

    public String getProtocolLocation() {
        return protocolLocation;
    }

    /**
     * Avro protocol location
     */
    public void setProtocolLocation(String protocolLocation) {
        this.protocolLocation = protocolLocation;
    }

    public String getProtocolClassName() {
        return protocolClassName;
    }

    /**
     * Avro protocol to use defined by the FQN class name
     */
    public void setProtocolClassName(String protocolClassName) {
        this.protocolClassName = protocolClassName;
    }

    public String getMessageName() {
        return messageName;
    }

    /**
     * The name of the message to send.
     */
    public void setMessageName(String messageName) {
        this.messageName = messageName;
    }

    public String getUriAuthority() {
        return uriAuthority;
    }

    /**
     * Authority to use (username and password)
     */
    public void setUriAuthority(String uriAuthority) {
        this.uriAuthority = uriAuthority;
    }

    public boolean isReflectionProtocol() {
        return reflectionProtocol;
    }

    /**
     * If protocol object provided is reflection protocol. Should be used only with protocol parameter because for protocolClassName protocol type will be auto detected
     */
    public void setReflectionProtocol(boolean isReflectionProtocol) {
        this.reflectionProtocol = isReflectionProtocol;
    }

    public boolean isSingleParameter() {
        return singleParameter;
    }

    /**
     * If true, consumer parameter won't be wrapped into array. Will fail if protocol specifies more then 1 parameter for the message
     */
    public void setSingleParameter(boolean singleParameter) {
        this.singleParameter = singleParameter;
    }
}
