/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;

/**
 *
 * @author HP
 */
public class SendSms {

    /**
     * Read Post URL with timeout to 1mn
     *
     * @return Stream readed
     */
    public String readPOSTById() {
        String url = "http://www.lesmsbus.com:7070/ines.smsbus/smsbusMt";
        Map<String, String> params = new HashMap<>();
        params.put("id", "90EAAE7EB9C08575");//ID
        params.put("from", "3MI");//sender ID
        params.put("to", "22671837604");//numero de telephone
        params.put("text", "Hi, C'est un test venant de mon API Java");//Message
        return read(url, "POST", params, 60000);
    }

    public String readPOSTByLoginPwd() {
        String url = "http://www.lesmsbus.com:7070/ines.smsbus/smsbusMt";
        Map<String, String> params = new HashMap<>();
        params.put("username", "test");//Login
        params.put("password", "test");//mot de passe
        params.put("from", "3MI");//sender ID
        params.put("to", "22671837604");//numero de telephone
        params.put("text", "Hi, C'est un test venant de mon API Java");//Message
        return read(url, "POST", params, 60000);
    }

    public String readGETById() {
        String url = "http://www.lesmsbus.com:7070/ines.smsbus/smsbusMt";
        Map<String, String> params = new HashMap<>();
        params.put("id", "90EAAE7EB9C08575");//ID
        params.put("from", "3MI");//sender ID
        params.put("to", "22671837604");//numero de telephone
        params.put("text", "Hi, C'est un test venant de mon API Java");//Message
        return read(url, "GET", params, 60000);
    }

    public String readGETByLoginPwd() {
        String url = "http://www.lesmsbus.com:7070/ines.smsbus/smsbusMt";
        Map<String, String> params = new HashMap<>();
        params.put("username", "test");//Login
        params.put("password", "test");//mot de passe
        params.put("from", "3MI");//sender ID
        params.put("to", "22671837604");//numero de telephone
        params.put("text", "Hi, C'est un test venant de mon API Java");//Message
        return read(url, "GET", params, 60000);
    }

    private String read(String URL, String method, Map<String, String> params, int httpConnectionTimeOut) {

        HttpURLConnection ucon = null;
        try {
            URL url = null;
            if (URL.contains("https")) {
                TrustManager tms[] = {new SmsbusTrustManager()};
                SSLContext sslctx2 = SSLContext.getInstance("SSL");
                sslctx2.init(null, tms, null);
                //******
                HttpsURLConnection.setDefaultSSLSocketFactory(sslctx2.getSocketFactory());

                HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {

                    @Override
                    public boolean verify(String string, SSLSession ssls) {
                        return true;
                    }
                });

            }
            if (method == null || method.trim().equalsIgnoreCase("GET")) {
                String paramStr = null;
                if (params != null) {
                    Iterator<String> it = params.keySet().iterator();
                    while (it.hasNext()) {
                        String param = it.next();
                        String value = params.get(param);
                        if (paramStr == null) {
                            paramStr = param + "=" + URLEncoder.encode(value, "UTF-8");
                        } else {
                            paramStr = paramStr + "&" + param + "=" + URLEncoder.encode(value, "UTF-8");
                        }
                    }
                }
                url = new URL(URL + (paramStr != null ? "?" + paramStr : ""));
                ucon = (HttpURLConnection) url.openConnection();
                if (httpConnectionTimeOut > 0) {
                    ucon.setConnectTimeout(httpConnectionTimeOut);
                    ucon.setReadTimeout(httpConnectionTimeOut);
                }
                ucon.setRequestMethod("GET");
                ucon.setDoOutput(true);
            } else {
                url = new URL(URL);
                ucon = (HttpURLConnection) url.openConnection();
                ucon.setDoOutput(true);
                String paramStr = null;
                if (params != null) {
                    PrintWriter pw = new PrintWriter(ucon.getOutputStream());
                    Iterator<String> it = params.keySet().iterator();
                    while (it.hasNext()) {
                        String param = it.next();
                        String value = params.get(param);
                        if (paramStr == null) {
                            pw.print(param + "=" + URLEncoder.encode(value, "UTF-8"));
                        } else {
                            pw.print("&" + param + "=" + URLEncoder.encode(value, "UTF-8"));
                        }
                    }
                    pw.flush();
                }
                if (httpConnectionTimeOut > 0) {
                    ucon.setConnectTimeout(httpConnectionTimeOut);
                    ucon.setReadTimeout(httpConnectionTimeOut);
                }
                ucon.setRequestMethod("POST");
            }
            ucon.connect();
            String str = null;

            StringBuilder response = new StringBuilder("");

            InputStream ins = ucon.getInputStream();
            try (InputStreamReader istr = new InputStreamReader(ins, "UTF-8")) {
                BufferedReader br = new BufferedReader(istr);
                while ((str = br.readLine()) != null) {
                    response = response.append(str);
                }
            }
            return response.toString();

        } catch (Exception e) {

        } finally {
            try {
                if (ucon != null) {
                    ucon.disconnect();
                    ucon = null;
                }
            } catch (Exception e) {
            }
        }
        return null;
    }

    class SmsbusTrustManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
            return;
        }

        @Override
        public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
            return;
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {
            return true;
        }

        public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {
            return true;
        }

    }

}
