package real;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.Hashtable;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.axis.components.net.BooleanHolder;
import org.apache.axis.components.net.SecureSocketFactory;

import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IConsole;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IMessage;
import com.dukascopy.api.IStrategy;
import com.dukascopy.api.ITick;
import com.dukascopy.api.Instrument;
import com.dukascopy.api.JFException;
import com.dukascopy.api.Period;
import com.dukascopy.api.Properties;

@Library("C:/Users/Juan/Documents/JForex/Strategies/axis.jar;C:/Users/Juan/Documents/JForex/Strategies/mail-1.4.1.jar")

public class Sample implements IStrategy {
	//
    private static 	IConsole 			console		= null;
	private static	Mailer				mailer		= null;
	//

    public void onStart(IContext context) throws JFException {
    	try {
            console 		= context.getConsole();	 
            mailer			= new Mailer();
            console.getOut().println("STARTED");
            mailer.sendMail("information", "Strategy started");
            //    		
    	} catch (Exception e) {
    		console.getOut().println("ERROR starting strategy");
    		//logger.error(e.getMessage());
    	}
    }

    public void onStop() throws JFException {
    	try {
    		console.getOut().println("STOPPED");
    		mailer.sendMail("information", "Strategy stoped");
    		//
    	} catch (Exception e) {
    		console.getOut().println("ERROR starting strategy");
    		//logger.error(e.getMessage());    		
    	}
    }

    public void onTick(Instrument instrument, ITick tick) throws JFException {
    	//
    }

    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) {
    	//
    }

    public void onMessage(IMessage message) throws JFException {
    	//
    }

    public void onAccount(IAccount account) throws JFException {	    	
    	//
    }
    
    
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  // gmail    
   
  public class MailAuthenticator extends Authenticator {   	
	   private String username;   	
	   private String password;

	   public MailAuthenticator(String user, String pass) {
		   username = user;
		   password = pass;
	   }

	   public PasswordAuthentication getPasswordAuthentication() {
		   return new PasswordAuthentication(username, password);
	   }
   }
   

  public static class JcmSSLSocketFactory  extends SSLSocketFactory  implements SecureSocketFactory {
	  private SSLSocketFactory factory;

	  public JcmSSLSocketFactory(Hashtable attributes){
		  // @todo: Comprobar que hace Axis con los atributos del Hashtable De momento pasamos
		  this();
	  }

	  private JcmSSLSocketFactory() {
		  super();
		  try {
			  //*** Crear un trust manager que no valide los certificados
			  TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
				  public java.security.cert.X509Certificate[] getAcceptedIssuers() {
					  return new java.security.cert.X509Certificate[0];
				  }

				  public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
				  }

				  public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
				  }
			  }
			  };

			  //*** Instalar el trust manager
			  SSLContext sc = SSLContext.getInstance("SSL");
			  sc.init(null, trustAllCerts, new java.security.SecureRandom());
			  factory = sc.getSocketFactory();
		  } catch (KeyManagementException ex) {    	       	
		  } catch (NoSuchAlgorithmException ex) {    	       	
		  }
	  }

	  public static SocketFactory getDefault() {    	        
		  return new JcmSSLSocketFactory();    	    
	  }

	  public Socket createSocket() throws IOException {
		  return factory.createSocket();
	  }

	  public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException {
		  return factory.createSocket(socket, s, i, flag);
	  }

	  public Socket createSocket(InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException {
		  return factory.createSocket(inaddr, i, inaddr1, j);
	  }

	  public Socket createSocket(InetAddress inaddr, int i) throws IOException {
		  return factory.createSocket(inaddr, i);
	  }

	  public Socket createSocket(String s, int i, InetAddress inaddr, int j) throws IOException {
		  return factory.createSocket(s, i, inaddr, j);
	  }

	  public Socket createSocket(String s, int i) throws IOException {
		  return factory.createSocket(s, i);
	  }

	  public String[] getDefaultCipherSuites() {
		  return factory.getDefaultCipherSuites();
	  }

	  public String[] getSupportedCipherSuites() {
		  return factory.getSupportedCipherSuites();
	  }

	  public Socket create(String host,  int port, StringBuffer otherHeaders, BooleanHolder useFullURL) throws Exception{
		  return this.createSocket(host, port);
	  }
  }
  
  public class Mailer {
	  
	  public Mailer () {
		  
	  }
	 
	  public void sendMail(String subject, String text)  {
		  try {
			  //org.apache.axis.AxisProperties.setProperty("axis.socketSecureFactory","org.apache.axis.components.net.SunFakeTrustSocketFactory");
			  //
			  Properties 			smtp = new Properties();
			  MailAuthenticator 	ma 	 = new MailAuthenticator("aaaaa", "bbbbb");
			  //
			  smtp.setProperty("mail.transport.protocol", "smtp");
			  smtp.setProperty("mail.smtp.host", "smtp.googlemail.com");
			  smtp.setProperty("mail.smtp.port", "465");
			  smtp.setProperty("mail.smtp.auth", "true");            
			  smtp.setProperty("mail.smtp.starttls.enable", "true");
			  smtp.setProperty("mail.smtp.socketFactory.port", "465"); 
			  smtp.setProperty("mail.smtp.socketFactory.class", Sample.JcmSSLSocketFactory.class.getName());
			  smtp.setProperty("mail.smtp.socketFactory.fallback", "false");
			  //
			  Session 	mSess = Session.getInstance(smtp, ma);
			  Transport	mTran = mSess.getTransport();
			  try {
				  mTran.connect();
				  //
				  MimeMessage msg = new MimeMessage(mSess);
				  msg.setFrom(new InternetAddress("xxxx"));
				  msg.setRecipient(RecipientType.TO, new InternetAddress("yyyyy"));                
				  msg.addHeader("MIME-Version", "1.0");            
				  msg.addHeader("X-Mailer", "jcm");                
				  msg.setSubject(subject);
				  msg.setContent(text, "text/html");
				  //
				  mTran.send(msg);                
			  } finally {
				  mTran.close();
			  }
			  //
		  } catch (Exception e) {
			  //logger.error(" " + e.getMessage());
		  }
	  }
	  
  }

  
}
