/*
 *  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 ZookeeperContainer extends GenericContainer {
    private static final String ZOOKEEPER_CONTAINER = "strimzi/kafka:0.11.4-kafka-2.1.0";
    private static final int ZOOKEEPER_PORT = 2181;

    public ZookeeperContainer(Network network, String name) {
        super(ZOOKEEPER_CONTAINER);

        withEnv("LOG_DIR", "/tmp/logs");
        withExposedPorts(ZOOKEEPER_PORT);
        withNetwork(network);
        withCreateContainerCmdModifier(
                new Consumer<CreateContainerCmd>() {
                    @Override
                    public void accept(CreateContainerCmd createContainerCmd) {
                        createContainerCmd.withHostName(name);
                        createContainerCmd.withName(name);
                    }
                }
        );

        withCommand( "sh", "-c",
                "bin/zookeeper-server-start.sh config/zookeeper.properties");

        waitingFor(Wait.forListeningPort());
    }


    public int getZookeeperPort() {
        return getMappedPort(ZOOKEEPER_PORT);
    }

}
