/*
 * 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.
 */
package saflanapi;

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.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;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 *
 *
 * @author 3MI
 */
public class ApiSaflan {

    /**
     * Read Post URL with timeout to 1mn
     * https://saflan-bf.com:7170/saflanentreprise/rechargerCredit?login=login&password=password&msisdns=tels&option=opts&montant=montant
     *
     * @return Stream readed
     */
    public String rechargerCredit() {
        String url = "https://saflan-bf.com:7170/saflanentreprise/rechargerCredit";
        Map<String, String> params = new HashMap<>();
        params.put("login", "saflan@3m-i.com");//login
        params.put("password", "*******");//password
        /*
         * msisdns: Contient les numéros de téléphone sans « + » ni « 00 » ni « 226 »
        * Les numéros de téléphone doivent être séparés par des virgules. Exemple :
        * 76137504,78398427,71276396,25344528
         */
        params.put("msisdns", "78378417");//Msisds separate by ','
        /*option: 
        Valeur 0 signifie recharge standard (SAPSAP, NANAN EXPRESS, FLASH).
        (option par défaut) Valeur 1 signifie recharger via Mobile Money (beaucoup
        plus de bonus) Nb : Selon les offres de bonus de l’operateurs du jour, on
         indique 0 ou 1 pour en bénéficier. L’option 1 n’est pas valide pour les
           numéros TELECEL
         */
        params.put("option", "0");//option 0=recharge standard, 1= recharge via Mobile Money
        /*
        montant: 
        Doit être un nombre entier supérieur>100
        Exemple:125
         */
        params.put("montant", "125");//recharge de 125F
        return read(url, "POST", params, 60000);
    }

    /**
     * Read Post URL with timeout to 1mn
     * https://saflan-bf.com:7170/saflanentreprise/rechargerData?login=login&password=password&msisdns=tels
     * &codeData=code-data
     *
     * @return Stream readed
     */
    public String rechargerForfaitInternet() {
        String url = "https://saflan-bf.com:7170/saflanentreprise/rechargerData";
        Map<String, String> params = new HashMap<>();
        params.put("login", "saflan@yahoo.fr");//login
        params.put("password", "*****");//login
        /*
         * msisdns: Contient les numéros de téléphone sans « + » ni « 00 » ni « 226 »
        * Les numéros de téléphone doivent être séparés par des virgules. Exemple :
        * 76137504,78398427,71276396,25344528
         */
        params.put("msisdns", "76137504,76837402");//Msisds separate by ','
        /**
         * La liste des codeData est para opérateur est se trouve dans le
         * document technique
         */
        params.put("codeData ", "CL-10Mo-100F-1JR");//option 0=recharge standard, 1= recharge via Mobile Money
        return read(url, "POST", params, 60000);
    }

    /**
     * Read Post URL with timeout to 1mn
     * https://saflan-bf.com:7170/saflanentreprise/readState?login=login&password=password&transId=transactionId
     * &codeData=code-data
     *
     * @return Stream readed
     */
    public String readState() {
        String url = "https://saflan-bf.com:7170/saflanentreprise/readState";
        Map<String, String> params = new HashMap<>();
        params.put("login", "saflan@yahoo.fr");//login
        params.put("password", "*****");//login
        /**
         * Contient la transactionId de la recharge success du numéro.
         */
        params.put("transId", "p20220609.478");//option 0=recharge standard, 1= recharge via Mobile Money
        return read(url, "POST", 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);
                 ucon.setRequestMethod("POST");
                
                if (params != null) {
                    PrintWriter pw = new PrintWriter(ucon.getOutputStream());
                    Iterator<String> it = params.keySet().iterator();
                    int i=0;
                    while (it.hasNext()) {
                        String param = it.next();
                        String value = params.get(param);
                        if (i==0) {
                            pw.print(param + "=" + URLEncoder.encode(value, "UTF-8"));
                        } else {
                            pw.print("&" + param + "=" + URLEncoder.encode(value, "UTF-8"));
                        }
                        i++;
                    }
                    pw.flush();
                }
                if (httpConnectionTimeOut > 0) {
                    ucon.setConnectTimeout(httpConnectionTimeOut);
                    ucon.setReadTimeout(httpConnectionTimeOut);
                }
            }
            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) {
            e.printStackTrace();
        } 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;
        }

    }

}
