/*
 * 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.kafkaconnector.common.services.kafka;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public final class KafkaServiceFactory {
    private static final Logger LOG = LoggerFactory.getLogger(KafkaServiceFactory.class);

    private KafkaServiceFactory() {

    }

    public static KafkaService createService() {
        String kafkaInstanceType = System.getProperty("kafka.instance.type");


        if (kafkaInstanceType == null || kafkaInstanceType.equals("embedded")) {
            return new EmbeddedKafkaService();
        }

        if (kafkaInstanceType.equals("local-strimzi-container")) {
            return new StrimziService();
        }

        if (kafkaInstanceType.equals("local-kafka-container")) {
            return new ContainerLocalKafkaService();
        }

        if (kafkaInstanceType.equals("remote")) {
            return new RemoteKafkaService();
        }

        LOG.error("Kafka instance must be one of 'local-strimzi-container', 'local-kafka-container', 'embedded' or 'remote");
        throw new UnsupportedOperationException("Invalid Kafka instance type");
    }

}
