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

import java.util.function.Consumer;

import com.github.dockerjava.api.command.CreateContainerCmd;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.Network;
import org.testcontainers.containers.wait.strategy.Wait;

public class StrimziContainer extends GenericContainer {
    private static final String STRIMZI_CONTAINER = System.getProperty("itest.strimzi.container.image");
    private static final int KAFKA_PORT = 9092;

    public StrimziContainer(Network network, String name) {
        super(STRIMZI_CONTAINER);

        withEnv("LOG_DIR", "/tmp/logs");
        withExposedPorts(KAFKA_PORT);
        withEnv("KAFKA_ADVERTISED_LISTENERS", "PLAINTEXT://localhost:9092");
        withEnv("KAFKA_LISTENERS", "PLAINTEXT://0.0.0.0:9092");
        withEnv("KAFKA_ZOOKEEPER_CONNECT", "zookeeper:2181");
        withNetwork(network);

        withCreateContainerCmdModifier(
                new Consumer<CreateContainerCmd>() {
                    @Override
                    public void accept(CreateContainerCmd createContainerCmd) {
                        createContainerCmd.withHostName(name);
                        createContainerCmd.withName(name);
                    }
                }
        );

        withCommand("sh", "-c",
                "bin/kafka-server-start.sh config/server.properties "
                        + "--override listeners=${KAFKA_LISTENERS} "
                        + "--override advertised.listeners=${KAFKA_ADVERTISED_LISTENERS} "
                        + "--override zookeeper.connect=${KAFKA_ZOOKEEPER_CONNECT}");

        waitingFor(Wait.forListeningPort());
    }



    public int getKafkaPort() {
        return getMappedPort(KAFKA_PORT);
    }


    @Override
    public void start() {
        addFixedExposedPort(KAFKA_PORT, KAFKA_PORT);
        super.start();
    }
}
