package dst.ass3.elastic.impl;

import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.model.Container;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientBuilder;
import com.github.dockerjava.core.DockerClientConfig;
import dst.ass3.elastic.ContainerException;
import dst.ass3.elastic.ContainerInfo;
import dst.ass3.elastic.ContainerNotFoundException;
import dst.ass3.elastic.IContainerService;
import dst.ass3.messaging.RequestType;

import java.util.ArrayList;
import java.util.List;

public class ContainerService implements IContainerService {
    final static DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder().withDockerHost("tcp://192.168.99.99:2375").build();

    @Override
    public List<ContainerInfo> listContainers() throws ContainerException {
        DockerClient docker = DockerClientBuilder.getInstance(config).build();

        ArrayList<ContainerInfo> ret = new ArrayList<>();
        for (Container c : docker.listContainersCmd().exec()) {
            ContainerInfo ci = new ContainerInfo();
            ci.setContainerId(c.getId());
            ci.setImage(c.getImage());
            ci.setRunning(true);
            ci.setWorkerType(RequestType.valueOf((c.getCommand().split(" "))[2].toUpperCase()));
            ret.add(ci);
        }
        return ret;
    }

    @Override
    public void stopContainer(String containerId) throws ContainerException {
        DockerClient docker = DockerClientBuilder.getInstance(config).build();
        try {
            docker.stopContainerCmd(containerId).exec();
            docker.removeContainerCmd(containerId).exec();
        } catch (NotFoundException e) {
            throw new ContainerNotFoundException(e);
        }
    }

    @Override
    public ContainerInfo startWorker(RequestType type) throws ContainerException {
        DockerClient docker = DockerClientBuilder.getInstance(config).build();

        CreateContainerResponse container = docker.createContainerCmd("dst/ass3-worker").withCmd(type.toString().toLowerCase()).exec();
        docker.startContainerCmd(container.getId()).exec();

        ContainerInfo ci = new ContainerInfo();
        ci.setWorkerType(type);
        ci.setImage("dst/ass3-worker");
        ci.setContainerId(container.getId());

        InspectContainerResponse inspect = docker.inspectContainerCmd(container.getId()).exec();

        try {
            ci.setRunning(inspect.getState().getRunning());
        } catch (NullPointerException e) {
            ci.setRunning(false);
        }
        return ci;
    }
}
