/*
 * Created on 04.03.2013
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package de.indexrennen.jforex.client;

import java.io.File;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
import java.util.Vector;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IMessage;
import com.dukascopy.api.IOrder;
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.system.ClientFactory;
import com.dukascopy.api.system.IClient;
import com.dukascopy.api.system.ISystemListener;
import com.dukascopy.api.system.JFAuthenticationException;
import com.dukascopy.api.system.JFVersionException;

public class TradeClientTest
{
	private static final Logger LOGGER = LoggerFactory.getLogger(TradeClientTest.class);
	private static final ResourceBundle dcConfig = ResourceBundle.getBundle("dukascopy");

	private static IClient client;
	private static Vector<Instrument> instruments;
	protected static IContext context;

	/**
	 * @param args
	 * @throws Exception 
	 * @throws JFVersionException 
	 * @throws JFAuthenticationException 
	 */
	public static void main(String[] args) throws JFAuthenticationException, JFVersionException, Exception
	{

		client = ClientFactory.getDefaultInstance();
		client.setCacheDirectory(new File("./tradeclientcache"));

		//set the listener that will receive system events
		client.setSystemListener(new ISystemListener()
		{
			private int lightReconnects = 3;


			@Override
			public void onConnect()
			{
				LOGGER.info("Connected");
				lightReconnects = 3;
			}


			@Override
			public void onDisconnect()
			{
				LOGGER.warn("Disconnected");

				//Abschiessen mit gewalt und von aussen neu starten lassen.
				System.exit(0);

				if (lightReconnects > 0)
				{
					client.reconnect();
					lightReconnects--;
				}
				else
				{
					try
					{
						//sleep for 10 seconds before attempting to reconnect
						Thread.sleep(10000);
					}
					catch (InterruptedException e)
					{
						//ignore
					}
					try
					{
						client.connect(dcConfig.getString("dukascopyURL"),
							dcConfig.getString("username"),
							dcConfig.getString("password"));
					}
					catch (Exception e)
					{
						LOGGER.error(e.getMessage(), e);
					}
				}
			}


			@Override
			public void onStart(long processId)
			{
				LOGGER.info("Strategy started: " + processId);
			}


			@Override
			public void onStop(long processId)
			{
				LOGGER.info("Strategy stopped: " + processId);
			}
		});

		LOGGER.info("Connecting...");
		//connect to the server using jnlp, user name and password
		client.connect(dcConfig.getString("dukascopyURL"),
			dcConfig.getString("username"), dcConfig.getString("password"));
		//wait for it to connect
		int i = 10; //wait max ten seconds
		while (i > 0 && !client.isConnected())
		{
			Thread.sleep(1000);
			i--;
		}
		if (!client.isConnected())
		{
			LOGGER.error("Failed to connect Dukascopy servers");
			System.exit(1);
		}

		StringTokenizer ist = new StringTokenizer(
			dcConfig.getString("instruments"), ",");
		instruments = new Vector<Instrument>();
		while (ist.hasMoreElements())
		{
			instruments.add(Instrument.fromString(ist.nextToken()));
		}

		LOGGER.info("Handling " + instruments.size() + " instruments ");

		client.startStrategy(new IStrategy()
		{

			@Override
			public void onAccount(IAccount arg0) throws JFException
			{
				// TODO Auto-generated method stub

			}


			@Override
			public void onBar(Instrument arg0, Period arg1, IBar arg2, IBar arg3)
				throws JFException
			{
				IOrder order = context.getEngine().getOrders().get(1);
				
				if (order.getInstrument().equals(arg0))
				{
					LOGGER.info ("Strategys on Bar Called " + arg0 + " " + arg2);
					order.setStopLossPrice(order.getStopLossPrice() + order.getInstrument().getPipValue());
				}				
			}


			@Override
			public void onMessage(final IMessage arg0) throws JFException
			{
				
				if (!("" + arg0.getContent()).equals("null"))
				{
					LOGGER.info("Message type "
								+ arg0.getType()
								+ " "
								+ arg0.getContent()
								+ (arg0.getOrder() != null ? " related order "
																+ arg0.getOrder().getLabel()
																+ " state "
																+ arg0.getOrder().getState() : " no order related"));
				}
			}


			@Override
			public void onStart(IContext arg0) throws JFException
			{
				context = arg0;
				HashSet<Instrument> iset = new HashSet<Instrument>(instruments);
				arg0.setSubscribedInstruments(iset);
			}


			@Override
			public void onStop() throws JFException
			{
				// TODO Auto-generated method stub

			}


			@Override
			public void onTick(Instrument arg0, ITick arg1) throws JFException
			{
				// TODO Auto-generated method stub

			}
		});

	}

}
