/*******************************************************************************
 * Copyright (c) 2011 University of Tennessee and others.
 * All rights reserved. This program and the accompanying materials
 * are 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
 *
 * Contributors:
 *     Roland Schulz - initial API and implementation
 *******************************************************************************/

package org.eclipse.ptp.rdt.sync.core.tests;

import static org.junit.Assert.*;

import java.util.Random;

import org.eclipse.ptp.rdt.sync.git.core.GitRemoteSyncConnection;
import org.eclipse.ptp.rdt.sync.git.core.SyncFileFilter;
import org.eclipse.ptp.remote.core.IRemoteConnection;
import org.eclipse.ptp.remote.core.IRemoteConnectionManager;
import org.eclipse.ptp.remote.core.IRemoteFileManager;
import org.eclipse.ptp.remote.core.IRemoteServices;
import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
import org.eclipse.ptp.remotetools.environment.generichost.core.ConfigFactory;
import org.junit.rules.ExternalResource;
import org.junit.rules.TemporaryFolder;

import org.eclipse.core.filesystem.EFS;

@SuppressWarnings("restriction")
public class TemporaryGitRemoteSyncConnection extends ExternalResource {
	private GitRemoteSyncConnection fGITConn;
	private IRemoteConnection fRemoteConnection;
	private TemporaryFolder localFolder;
	private static Random random = new Random();
	private IRemoteFileManager fileManager;
	private BasicGitSyncTests test;
	private String remoteFolder;
	private IRemoteConnectionManager connMgr;
	
	public TemporaryGitRemoteSyncConnection(BasicGitSyncTests basicGitSyncTests) {
		test = basicGitSyncTests;
	}

	@Override
	protected void before() throws Throwable {
		create();
	}

	@Override
	protected void after() {
		delete();
	}
	
	public GitRemoteSyncConnection getGITConn() {
		return fGITConn;
	}
	
	public TemporaryFolder getLocalFolder() {
		return localFolder;
	}
	
	public String getRemoteFolder() {
		return remoteFolder;
	}

	public IRemoteFileManager getFileManager() {
		return fileManager;
	}

	private void create() throws Exception {
		long n = random.nextInt(1000000);
		remoteFolder = test.remoteBaseDir + "/junit" + n;
		
		/* setup remote connection */
		IRemoteServices fRemoteServices;
		
		fRemoteServices = PTPRemoteCorePlugin.getDefault().getRemoteServices(
				"org.eclipse.ptp.remote.RemoteTools"); //$NON-NLS-1$
		assertNotNull(fRemoteServices);

		connMgr = fRemoteServices.getConnectionManager();
		assertNotNull(connMgr);

		//TODO: understand why it is causes problem when all connections are called the same. Should be fine because 
		// connections are deleted. There seems to be a problem in RemoteTools with creating a new connection with the same name
		fRemoteConnection = connMgr.newConnection("test_connection"+n); //$NON-NLS-1$  

		assertNotNull(fRemoteConnection);
		fRemoteConnection.setAddress(test.host);
		fRemoteConnection.setUsername(test.username);
		if (test.privatekey == null) {
			fRemoteConnection.setPassword(test.password);
		} else {
			fRemoteConnection.setAttribute(ConfigFactory.ATTR_KEY_PATH, test.privatekey);
			fRemoteConnection.setAttribute(ConfigFactory.ATTR_KEY_PASSPHRASE, test.password);
			fRemoteConnection.setAttribute(ConfigFactory.ATTR_IS_PASSWORD_AUTH, Boolean.toString(false));
		}
		
		if (!fRemoteConnection.isOpen()) {
			fRemoteConnection.open(null);
		}
		
		fileManager = fRemoteConnection.getRemoteServices().getFileManager(fRemoteConnection);
		
		/*local folder*/
		localFolder = new TemporaryFolder();
		localFolder.create();
		
		/*remote folder (just delete - is created by GitRemoteSyncConnection)*/
		fileManager.getResource(remoteFolder).delete(EFS.NONE, null);
		
		fGITConn = new GitRemoteSyncConnection(fRemoteConnection,
				localFolder.getRoot().getPath(), remoteFolder,
				new SyncFileFilter() {
					public boolean shouldIgnore(String fileName) {
						if (fileName.startsWith(GitRemoteSyncConnection.gitDir)) {
							return true;
						}
						return false;
					}
				}, null);
	}

	private void delete()  {
		String failMessage="";
		
		fGITConn.close();
		localFolder.delete();
		
		try {
			fileManager.getResource(remoteFolder).delete(EFS.NONE, null);
		} catch (Exception e){
			e.printStackTrace();
			failMessage += e.getMessage(); //don't fail yet - try to clean up as much as possible
		}
		
		fRemoteConnection.close();
		try {
			connMgr.removeConnection(fRemoteConnection);
		} catch (Exception e){
			e.printStackTrace();
			failMessage += e.getMessage(); //don't fail yet - try to clean up as much as possible
		}
		
		if (!failMessage.equals("")) {
			fail(failMessage);
		}
	}

	public IRemoteConnection getRemoteConn() {
		return fRemoteConnection;
	}
}
