import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.Socket;
import java.net.SocketTimeoutException;

/**
 * Clase que permite envio de mensajes a UCI mediante sockets
 * 
 * @author Fit-Bank
 */
public class UCIClient {

    /**
     * Metodo que permite cerrar los puertos abiertos.
     */
    private static void close(Socket client, InputStream in, OutputStream out) {
        if (out != null) {
            try {
                out.close();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        if (in != null) {
            try {
                in.close();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        if (client != null) {
            try {
                client.close();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }

    /**
     * Metodo que permite enviar mensajes a UCI, dado un host:puerto.
     */
    public static Object send(Object message, String host, Integer port, Integer timeout) {
        Socket client = null;
        InputStream in = null;
        OutputStream out = null;
        Object response;

        try {
            client = new Socket(host, port);
            client.setSoTimeout(timeout * 1000);
            in = client.getInputStream();
            out = client.getOutputStream();
            ObjectOutputStream oout = new ObjectOutputStream(out);

            oout.writeObject(message);
            oout.flush();

            ObjectInputStream oin = new ObjectInputStream(in);
            response = oin.readObject();
        } catch (ConnectException e) {
            response = "NO HAY CONECCION CON UCI: " + e.getMessage();
        } catch (SocketTimeoutException e) {
            response = "TIMEOUT DE CONECCION CON UCI: " + e.getMessage();
        } catch (Exception e) {
            response = "ERROR GENERAL: " + e.getMessage();
        } finally {
            close(client, in, out);
        }

        return response;
    }
}
