/*******************************************************************************
 * Copyright (c) 2017 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributor:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.eclipse.linuxtools.docker.integration.tests.mock;

import static org.junit.Assert.assertTrue;
import com.spotify.docker.client.messages.ContainerInfo;

import java.io.File;
import java.io.IOException;

import org.eclipse.linuxtools.docker.core.IDockerConnection;
import org.eclipse.linuxtools.docker.reddeer.ui.DockerExplorerView;
import org.eclipse.linuxtools.internal.docker.ui.testutils.MockContainerFactory;
import org.eclipse.linuxtools.internal.docker.ui.testutils.MockContainerInfoFactory;
import org.eclipse.linuxtools.internal.docker.ui.testutils.MockDockerClientFactory;
import org.eclipse.linuxtools.internal.docker.ui.testutils.MockDockerConnectionFactory;
import org.eclipse.linuxtools.internal.docker.ui.testutils.MockDockerConnectionSettingsFinder;
import org.eclipse.linuxtools.internal.docker.ui.testutils.MockImageFactory;
import org.jboss.reddeer.eclipse.ui.browser.BrowserView;
import org.jboss.reddeer.eclipse.ui.console.ConsoleView;

import com.spotify.docker.client.DockerClient;

public class MockUtils {

	public static void createDockerMockConnection(String connectionName) {
		DockerExplorerView de = new DockerExplorerView();
		de.open();
		File dockerSocketTmpFile = null;
		try {
			dockerSocketTmpFile = File.createTempFile("dockerMock", ".sock");
		} catch (IOException e) {
			new Exception("Cannot create mocked Docker connection!");
			e.printStackTrace();
		}
		MockDockerConnectionSettingsFinder.validUnixSocketConnectionAvailable(connectionName,
				"unix://" + dockerSocketTmpFile.getAbsolutePath());
		de.createDockerConnectionUnix(
				configureUnixSocketConnection(connectionName, "unix://" + dockerSocketTmpFile.getAbsolutePath()));
		assertTrue("Docker connection does not exist! ", de.connectionExistForName(connectionName));

	}

	private static IDockerConnection configureUnixSocketConnection(final String connectionName,
			final String pathToSocket) {
		DockerClient client = MockDockerClientFactory.build();
		final org.eclipse.linuxtools.internal.docker.core.DockerConnection dockerConnection = MockDockerConnectionFactory
				.from(connectionName, client).withUnixSocketConnectionSettings(pathToSocket);
		DockerExplorerView de = new DockerExplorerView();
		de.open();
		de.createDockerConnectionUnix(dockerConnection);
		MockDockerConnectionManager.configureConnectionManager(dockerConnection);
		return dockerConnection;
	}

	public static void pullImage(String connectionName, String imageName, String imageTag) {
		final DockerClient client = MockDockerClientFactory
				.image(MockImageFactory.id("987654321abcde").name(imageName + ":" + imageTag).build()).build();
		final org.eclipse.linuxtools.internal.docker.core.DockerConnection dockerConnection = MockDockerConnectionFactory
				.from(connectionName, client).withDefaultTCPConnectionSettings();
		MockDockerConnectionManager.configureConnectionManager(dockerConnection);
	}

	public static void removeImage(String connectionName, String imageName, String imageTag) {
		final DockerClient client = MockDockerClientFactory.build();
		final org.eclipse.linuxtools.internal.docker.core.DockerConnection dockerConnection = MockDockerConnectionFactory
				.from(connectionName, client).withDefaultTCPConnectionSettings();
		MockDockerConnectionManager.configureConnectionManager(dockerConnection);
	}

	public static void runContainer(String connectionName, String imageName, String imageTag, String containerName) {
		final DockerClient client = MockDockerClientFactory
				.container(MockContainerFactory.name(containerName).status("Stopped").build())
				.image(MockImageFactory.id("987654321abcde").name(imageName + ":" + imageTag).build()).build();
		final org.eclipse.linuxtools.internal.docker.core.DockerConnection dockerConnection = MockDockerConnectionFactory
				.from(connectionName, client).withDefaultTCPConnectionSettings();
		MockDockerConnectionManager.configureConnectionManager(dockerConnection);
	}
	
	public static void runContainer(String connectionName, String imageName, String imageTag, String containerName, ContainerInfo containerInfo) {
		final DockerClient client = MockDockerClientFactory
				.container(MockContainerFactory.name(containerName).status("Stopped").build(), MockContainerInfoFactory.link("alpine").volume("resources/test-volumes/index.html").id("TestTestTestTestTest")
						.ipAddress("127.0.0.1").build())
				.image(MockImageFactory.id("987654321abcde").name(imageName + ":" + imageTag).build()).build();
		final org.eclipse.linuxtools.internal.docker.core.DockerConnection dockerConnection = MockDockerConnectionFactory
				.from(connectionName, client).withDefaultTCPConnectionSettings();
		MockDockerConnectionManager.configureConnectionManager(dockerConnection);
	}

	public static ConsoleView getConsoleViewText(String msg) {
		final ConsoleView cv = MockConsoleView.msg(msg).build();
		return cv;
	}

	public static BrowserView getBrowserView(String url, String text) {
		final BrowserView browser = MockBrowserView.openPageURL(url).setText(text).build();
		return browser;
	}

}
