/*
 * Copyright 2011 Dukascopy Bank SA. All rights reserved.
 * DUKASCOPY PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.dukascopy.api.impl.connect;

import java.text.SimpleDateFormat;
import java.util.List;

import com.dukascopy.api.Filter;
import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IConsole;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IHistory;
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.OfferSide;
import com.dukascopy.api.Period;

/**
 * @author aburenin
 */
public class TestHistoryBarsStrategy implements IStrategy {
    
    protected IHistory history;
    protected IConsole console;
    
    private SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss") /*{{setTimeZone(TimeZone.getTimeZone("GMT"));}}*/;

    /* (non-Javadoc)
     * @see com.dukascopy.api.IStrategy#onStart(com.dukascopy.api.IContext)
     */
    @Override
    public void onStart(IContext context) throws JFException {
        this.history = context.getHistory();
        this.console = context.getConsole();
    }

    /* (non-Javadoc)
     * @see com.dukascopy.api.IStrategy#onTick(com.dukascopy.api.Instrument, com.dukascopy.api.ITick)
     */
    @Override
    public void onTick(Instrument instrument, ITick tick) throws JFException {
    }

    /* (non-Javadoc)
     * @see com.dukascopy.api.IStrategy#onBar(com.dukascopy.api.Instrument, com.dukascopy.api.Period, com.dukascopy.api.IBar, com.dukascopy.api.IBar)
     */
    @Override
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
        boolean askFlat = (askBar.getOpen() == askBar.getClose() && askBar.getOpen() == askBar.getHigh() && askBar.getOpen() == askBar.getLow() && askBar.getVolume() <= 0);
        boolean bidFlat = (bidBar.getOpen() == bidBar.getClose() && bidBar.getOpen() == bidBar.getHigh() && bidBar.getOpen() == bidBar.getLow() && bidBar.getVolume() <= 0);
        if (askFlat){
            console.getOut().println(String.format("Ask Bar is flat, instrument: %1$s, period: %2$s", instrument, period));
            getHistoryBars(instrument, period, Filter.ALL_FLATS, OfferSide.ASK);
            getHistoryBars(instrument, period, Filter.NO_FILTER, OfferSide.ASK);
        }
        if (bidFlat){
            console.getOut().println(String.format("Bid Bar is flat, instrument: %1$s, period: %2$s", instrument, period));
            getHistoryBars(instrument, period, Filter.ALL_FLATS, OfferSide.BID);
            getHistoryBars(instrument, period, Filter.NO_FILTER, OfferSide.BID);
        }
    }

    /* (non-Javadoc)
     * @see com.dukascopy.api.IStrategy#onMessage(com.dukascopy.api.IMessage)
     */
    @Override
    public void onMessage(IMessage message) throws JFException {
        // TODO Auto-generated method stub

    }

    /* (non-Javadoc)
     * @see com.dukascopy.api.IStrategy#onAccount(com.dukascopy.api.IAccount)
     */
    @Override
    public void onAccount(IAccount account) throws JFException {
        // TODO Auto-generated method stub

    }

    /* (non-Javadoc)
     * @see com.dukascopy.api.IStrategy#onStop()
     */
    @Override
    public void onStop() throws JFException {
        // TODO Auto-generated method stub

    }
    
    private void getHistoryBars(Instrument instrument, Period period, Filter filter, OfferSide offerSide) throws JFException{
        int numberOfCandlesBefore = 1;
        long startTimeOfCurrentBar = history.getStartTimeOfCurrentBar(instrument, period);
        String formattedStartTime = dateFormat.format(startTimeOfCurrentBar);
        
        List<IBar> bars = history.getBars(instrument,period, offerSide, filter,numberOfCandlesBefore,startTimeOfCurrentBar,0);
        long historyTime = bars.get(numberOfCandlesBefore-1).getTime();
        String formattedHistoryTime = dateFormat.format(historyTime);
        if (startTimeOfCurrentBar != historyTime){
            console.getErr().println(String.format("Start time of the current bar [%1$s] is not equal to final bar in history [%2$s]", formattedStartTime,  formattedHistoryTime));
        }
        
        console.getOut().println(String.format("Bars History [instrument: %1$s, period: %2$s, filter: %3$s, offer side: %4$s, start time of the current bar:  %5$s]: %6$s", instrument, period, filter, offerSide, formattedStartTime, bars));
    }
}
