package com.atsebak.embeddedlinuxjvm.protocol.ssh;

import com.atsebak.embeddedlinuxjvm.protocol.ssh.jsch.EmbeddedSSHClient;
import com.jcraft.jsch.Session;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import org.jetbrains.annotations.Nullable;

import java.io.IOException;
import java.net.InetAddress;

@Builder
public class SSHConnectionValidator {

    private String ip;
    private String username;
    @Nullable
    private String password;
    @Nullable
    private String key;
    private boolean useKey;
    private int port;

    /**
     * Pings to see if it can contact hostname
     *
     * @return
     */
    public boolean canConnectToHostname(int timeout) {
        try {
            return InetAddress.getByName(ip).isReachable(timeout);
        } catch (IOException e) {
            return false;
        }
    }

    /**
     * Can connect to remote target
     *
     * @return status
     */
    public SSHConnectionState checkSSHConnection() {
        try {
            EmbeddedSSHClient sshClient = EmbeddedSSHClient
                    .builder()
                    .port(port)
                    .username(username)
                    .password(password)
                    .hostname(ip)
                    .key(key)
                    .useKey(useKey)
                    .build();
            Session session = sshClient.get();
            return new SSHConnectionValidator.SSHConnectionState(session.isConnected(), null);
        } catch (Exception e) {
            return new SSHConnectionValidator.SSHConnectionState(false, e.getMessage());
        }
    }

    @Getter
    @AllArgsConstructor
    public static class SSHConnectionState {
        private boolean connected;
        private String message;

    }

}