package de.hacksaar.javatuer;

import com.jcraft.jsch.*;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class SshClient {
	private static final String TAG = "SshClient";
	private final String host;
	private final String username;
	private final int port;
	private final JSch jSch;
	private final TuerLogging log;
	private Session session;
	private Channel channel;

	public SshClient(String host, String username, int port, TuerLogging log) {
		this.host = host;
		this.username = username;
		this.port = port;
		this.log = log;
		JSch.setLogger(log);
		jSch = new JSch();
	}

	public void addPrivateKey(String keyFilePath) throws JSchException {
		jSch.addIdentity(keyFilePath);
	}

	public void addPrivateKey(String keyFilePath, String passphrase) throws JSchException {
		jSch.addIdentity(keyFilePath, passphrase);
	}

	public void disconnect() {
		channel.disconnect();
		channel = null;
		session.disconnect();
		session = null;
	}

	public String getHost() {
		return host;
	}

	public InputStream getInputStream() throws IOException {
		if (channel == null) {
			return null;
		}
		return channel.getInputStream();
	}

	public OutputStream getOutputStream() throws IOException {
		if (channel == null) {
			return null;
		}
		return channel.getOutputStream();
	}

	public int getPort() {
		return port;
	}

	public String getUsername() {
		return username;
	}

	public boolean isConnected() {
		return channel != null && channel.isConnected() && session != null && session.isConnected();
	}

	public void login(final String password) throws JSchException {
		login(new UserInfo() {

			@Override
			public String getPassphrase() {
				return null;
			}

			@Override
			public String getPassword() {
				return password;
			}

			@Override
			public boolean promptPassphrase(String s) {
				return false;
			}

			@Override
			public boolean promptPassword(String s) {
				return true;
			}

			@Override
			public boolean promptYesNo(String s) {
				return false;
			}

			@Override
			public void showMessage(String s) {
				log.info(TAG, s);
			}
		});
	}

	public void login() throws JSchException {
		login(new UserInfo() {

			@Override
			public String getPassphrase() {
				return null;
			}

			@Override
			public String getPassword() {
				return null;
			}

			@Override
			public boolean promptPassphrase(String s) {
				return false;
			}

			@Override
			public boolean promptPassword(String s) {
				return false;
			}

			@Override
			public boolean promptYesNo(String s) {
				return false;
			}

			@Override
			public void showMessage(String s) {
				log.info(TAG, s);
			}
		});
	}

	public void login(UserInfo userInfo) throws JSchException {
		log.debug(TAG, "Creating session");
		if (session == null) {
			session = jSch.getSession(username, host, port);
		}
		if (!session.isConnected()) {
			session.setUserInfo(userInfo);
			log.debug(TAG, "Connecting");
			session.connect();
			log.debug(TAG, "Opening channel");
			channel = session.openChannel("shell");
			channel.connect();
		}
	}

}
