package spartime.code;


import java.util.Iterator;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.axis2.transport.http.HttpTransportProperties;

public class EncodeurSpartimeClient {

        private static OMFactory fac = OMAbstractFactory.getOMFactory();
        private static OMNamespace omNs = fac.createOMNamespace("code.spartime.com", "tns");

        private EndpointReference targetEPR;
        private ServiceClient sender;

        public EncodeurSpartimeClient(String endPointReference, String userName, String password) throws AxisFault{
                targetEPR = new EndpointReference(endPointReference);
                Options options = new Options();

                HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
                auth.setUsername(userName);
                auth.setPassword(password);

                options.setProperty(HTTPConstants.AUTHENTICATE, auth);

                options.setTo(targetEPR);
                options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

                (sender = new ServiceClient()).setOptions(options);
        }

        public boolean setCryptoParameters(String key, int iv, String profil, int base) throws AxisFault{
                return ("true".equals(call("setCryptoParameters",new Object[]{key,new Integer(iv),profil,new Integer(base)})));
        }

        public String getCodeGestionnaire(String userName) throws AxisFault{
                return call("getCodeGestionnaire",new Object[]{userName});
        }

        public String getCodeInstallateur(String ISODate,String userName) throws AxisFault{
                return call("getCodeInstallateur",new Object[]{ISODate,userName});
        }

        public String getCodeDateADate(String ISOStart, String ISOEnd, boolean unique, int command,String userName) throws AxisFault{
                return call("getCodeDateADate",new Object[]{ISOStart,ISOEnd, new Boolean(unique),new Integer(command),userName});
        }

        public String getCodeFonctionAddOpposition(String code,String userName) throws AxisFault{
                return call("getCodeFonctionAddOpposition",new Object[]{code,userName});
        }
        public String getCodeFonctionDelOpposition(String code,String userName) throws AxisFault{
                return call("getCodeFonctionDelOpposition",new Object[]{code,userName});
        }
        public String getCodeFonctionAddPerso(String code, int command,String userName) throws AxisFault{
                return call("getCodeFonctionAddPerso",new Object[]{code,new Integer(command),userName});
        }
        public String getCodeFonctionDelPerso(String code,String userName) throws AxisFault{
                return call("getCodeFonctionDelPerso",new Object[]{code,userName});
        }
        public String getCodeFonctionDelActivite(int activite,String userName) throws AxisFault{
                return call("getCodeFonctionDelActivite",new Object[]{new Integer(activite),userName});
        }
        public String getCodeFonctionAddCreneau(int activite, int start, int end,String userName) throws AxisFault{
                return call("getCodeFonctionAddCreneau",new Object[]{new Integer(activite),new Integer(start),new Integer(end),userName});
        }
        public String getCodeFonctionModCreneau(int creneau, int start, int end,String userName) throws AxisFault{
                return call("getCodeFonctionModCreneau",new Object[]{new Integer(creneau),new Integer(start),new Integer(end),userName});
        }
        public String getCodeFonctionDelCreneau(int creneau,String userName) throws AxisFault{
                return call("getCodeFonctionDelCreneau",new Object[]{new Integer(creneau),userName});
        }
        public String getCodeFonctionSetDateTime(String ISODate,String userName) throws AxisFault{
                return call("getCodeFonctionSetDateTime",new Object[]{ISODate,userName});
        }

        public String getCodePeriodiqueJourV2(int user, String ISOStart, int duration, int nbTrimestres, int joursActifs, int command,String userName) throws AxisFault{
                return call("getCodePeriodiqueJourV2",new Object[]{new Integer(user),ISOStart,new Integer(duration),new Integer(nbTrimestres),new Integer(joursActifs),new Integer(command),userName});
        }

        public String getCodeInstantane(String ISODate, int delta,  boolean unique, int command,String userName) throws AxisFault{
                return call("getCodeInstantane",new Object[]{ISODate, new Integer(delta), new Boolean(unique), new Integer(command),userName});
        }

        public String getCodeHeure(String ISODateStart, String ISODateEnd, int user,  boolean unique, int command,String userName) throws AxisFault{
                return call("getCodeHeure",new Object[]{ISODateStart, ISODateEnd, new Integer(user), new Boolean(unique), new Integer(command),userName});
        }

        public String getCodeJour(String ISODateStart, String ISODateEnd, int user,  boolean unique, int command,String userName) throws AxisFault{
                return call("getCodeJour",new Object[]{ISODateStart, ISODateEnd, new Integer(user), new Boolean(unique), new Integer(command),userName});
        }


        public String getCodeMois(String ISODateStart, int nbMonth, int user, boolean unique, int command,String userName) throws AxisFault{
                return call("getCodeMois",new Object[]{ISODateStart, nbMonth, new Integer(user), new Boolean(unique), new Integer(command),userName});
        }

        public void addCodeQR(int serial, String code) throws AxisFault{
                call("addCodeQR",new Object[]{serial, code});
        }

        public void dropCodesQR() throws AxisFault{
                call("dropCodesQR",new Object[]{});
        }

        public String getQRCode(String... userName) throws AxisFault{
                return userName==null ? call("getQRCode",new Object[]{}) : call("getQRCode",new Object[]{userName[0]}) ;
        }

        public String getSerialFromCryptog(String cryptogramme) throws AxisFault{
                return call("getSerialFromCryptog",new Object[]{cryptogramme});
        }

        @SuppressWarnings("unchecked")
        public String[] getCryptoParametersFromShortKey(String shortKey) throws AxisFault{

                OMElement method = fac.createOMElement("getCryptoParametersFromShortKey", omNs);
                OMElement OMArg = fac.createOMElement("arg0", omNs);
                OMArg.addChild(fac.createOMText(OMArg,shortKey));
                method.addChild(OMArg);

                Iterator<OMElement> it = sender.sendReceive(method).getChildElements();

                String[] result = new String[3];
                result[0] = it.next().getText();
                result[1] = it.next().getText();
                result[2] = it.next().getText();
                return result;

        }

        private String call(String methodName, Object[] args) throws AxisFault{

                OMElement method = fac.createOMElement(methodName, omNs);

                for(int i=0;i<args.length;i++){
                        OMElement OMArg = fac.createOMElement("arg"+i, omNs);
                        OMArg.addChild(fac.createOMText(OMArg,(args[i]).toString()));
                        method.addChild(OMArg);
                }

                return sender.sendReceive(method).getFirstElement().getText();
        }

        public static void main(String[] args){
                try {

                        EncodeurSpartimeClient client = new EncodeurSpartimeClient("https://code.spartime.com/axis2/services/EncodeurSpartimeService?wsdl","test","test");
                        client.setCryptoParameters("0114A25205990CF5D2E6D7628036192B", 1, "0202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202", 14);
                        System.err.println("Serial(cryptog) = " + client.getSerialFromCryptog("021572"));
                        System.err.println("Code gestionnaire = " + client.getCodeGestionnaire("Jean Dupont"));

                        System.err.println("Code installateur = " + client.getCodeInstallateur("20081231T0000","Jean Dupont"));
                        System.err.println("Code de date à date = " + client.getCodeDateADate("20080223T0000", "20090707T2359", false, 1,"Jean Dupont"));
                        System.err.println("Code fonction ajout d'opposition = " + client.getCodeFonctionAddOpposition("12345678","Jean Dupont"));
                        System.err.println("Code fonction  suppression d'opposition = " + client.getCodeFonctionDelOpposition("123456","Jean Dupont"));
                        System.err.println("Code fonction ajout d'un code perso = " + client.getCodeFonctionAddPerso("1234", 1,"Jean Dupont"));
                        System.err.println("Code fonction suppression d'un code perso = " + client.getCodeFonctionDelPerso("1234","Jean Dupont"));
                        System.err.println("Code fonction suppression d'une activité = " + client.getCodeFonctionDelActivite(0,"Jean Dupont"));
                        System.err.println("Code fonction ajout d'un é = " + client.getCodeFonctionAddCreneau(0, 0, 671,"Jean Dupont"));
                        System.err.println("Code fonction modification d'un créneau = " + client.getCodeFonctionModCreneau(0, 0, 671,"Jean Dupont"));
                        System.err.println("Code fonction suppression d'un créneau = " + client.getCodeFonctionDelCreneau(0,"Jean Dupont"));
                        System.err.println("Code fonction mise à l'heure = " + client.getCodeFonctionSetDateTime("20081231T1400","Jean Dupont"));
                        System.err.println("Code périodique jour V2 = " + client.getCodePeriodiqueJourV2(0,"20080101T0800",10,3,3,1,"Jean Dupont"));
                        System.err.println("Code périodique jour V2 = " + client.getCodePeriodiqueJourV2(0,"20080101T0800",10,2,3,1,"Jean Dupont"));
                        System.err.println("Code périodique jour V2 = " + client.getCodePeriodiqueJourV2(0,"20080101T0800",10,1,3,1,"Jean Dupont"));
                        System.err.println("Code périodique jour V2 = " + client.getCodePeriodiqueJourV2(0,"20080101T0800",10,0,3,1,"Jean Dupont"));
                        System.err.println("Code instantané = " + client.getCodeInstantane("20090102T1427",1,false,3,"Jean Dupont"));
                        System.err.println("Code 1 heure = " + client.getCodeHeure("20090827T1400","20090827T1459",1,false,3,"Jean Dupont"));
                        System.err.println("Code 2 heures = " + client.getCodeHeure("20090827T1500","20090827T1659",1,false,3,"Jean Dupont"));
                        System.err.println("Code 24 heures = " + client.getCodeHeure("20090827T1500","20090828T1459",1,false,3,"Jean Dupont"));
                        System.err.println("Code 1/2 journée = " + client.getCodeJour("20090827T1200","20090827T2359",1,false,3,"Jean Dupont"));
                        System.err.println("Code 1/2 journée = " + client.getCodeJour("20090827T0000","20090827T1159",1,false,3,"Jean Dupont"));
                        System.err.println("Code 1 jour = " + client.getCodeJour("20090827T0000","20090827T2359",1,false,3,"Jean Dupont"));
                        System.err.println("Code 31 jours = " + client.getCodeJour("20090801T0000","20090831T2359",1,false,3,"Jean Dupont"));
                        System.err.println("Code 12 mois = " + client.getCodeMois("20030101T0000",12,0,false,1,"Jean Dupont"));
                        System.err.println("Code de mise à l'heure = " + client.getCodeFonctionSetDateTime("20100112T0910","Jean Dupont"));
                        System.err.println("Code de Date à Date = " + client.getCodeDateADate("20080223T0000", "20090707T2359", false, 1,"Jean Dupont"));
                       
                        client.dropCodesQR();
                        client.addCodeQR(1,"123456");
                        client.addCodeQR(1,"234567");
                        client.addCodeQR(1,"345678");
                        client.addCodeQR(2,"456789");
                        client.addCodeQR(2,"567890");
                        client.addCodeQR(3,"123789");

                        System.err.println("QRCode = " + client.getQRCode("Jean Dupont"));

                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}