package jforex;

import com.dukascopy.api.drawings.IPolyLineChartObject;
import java.util.*;

import com.dukascopy.api.*;
import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IChart;
import com.dukascopy.api.IChartObject;
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.Period;
import com.dukascopy.api.drawings.IShortLineChartObject;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class charts implements IStrategy {

    private IContext context = null;
    private IHistory history = null;
    private IChart chart = null;
    private Instrument instrument = null;
    private List<ITick> list = null;
    private List<SingleTick> futureList = new ArrayList<SingleTick>();
    private List<SingleTick> preveriosList = null;
    private ITick prev_tick = null;
    private Color askColor = null;
    private Color bidColor = null;
    //private IShortLineChartObject lineAsk = null;
    //private IShortLineChartObject lineBid = null;
    //private IPolyLineChartObject lineAsk1 = chart.getChartObjectFactory().createPolyLine();

    private class SingleTick implements ITick {

        private long time = 0;
        private double ask = 0;
        private double bid = 0;
        private double askVolume = 0;
        private double bidVolume = 0;
        private double totalAskVolume = 0;
        private double totalBidVolume = 0;

        public SingleTick(long time, double ask, double askVolume, double bid, double bidVolume) {
            this.time = time;
            this.ask = ask;
            this.bid = bid;
            this.askVolume = askVolume;
            this.bidVolume = bidVolume;
        }

        @Override
        public String toString() {
            return "{Time = " + getTime() + "[" /*new Date(getTime())*/ + "]" + " / Ask = " + getAsk() + " / Bid = " + getBid() + "}";
        }

        @Override
        public long getTime() {
            return time;
        }

        @Override
        public double getAsk() {
            return ask;
        }

        @Override
        public double getAskVolume() {
            return askVolume;
        }

        @Override
        public double[] getAskVolumes() {
            return null;
        }

        @Override
        public double[] getAsks() {
            return null;
        }

        @Override
        public double getBid() {
            return bid;
        }

        @Override
        public double getBidVolume() {
            return bidVolume;
        }

        @Override
        public double[] getBidVolumes() {
            return null;
        }

        @Override
        public double[] getBids() {
            return null;
        }

        @Override
        public double getTotalAskVolume() {
            return totalAskVolume;
        }

        @Override
        public double getTotalBidVolume() {
            return totalBidVolume;
        }
    }

    public void drawTick(ITick tick) {
        if (chart != null && prev_tick != null && tick != null) {
            IChartObject lineAsk = chart.draw(instrument.toString() + "_ASK_" + tick.getTime(), IChart.Type.SHORT_LINE, prev_tick.getTime(), prev_tick.getAsk(), tick.getTime(), tick.getAsk());
            lineAsk.setColor(askColor);
            IChartObject lineBid = chart.draw(instrument.toString() + "_BID_" + tick.getTime(), IChart.Type.SHORT_LINE, prev_tick.getTime(), prev_tick.getBid(), tick.getTime(), tick.getBid());
            lineBid.setColor(bidColor);
        }
        prev_tick = tick;
    }

    public void drawTick1(ITick tick) {
        if (chart != null && prev_tick != null && tick != null) {
            IShortLineChartObject lineAsk = chart.getChartObjectFactory().createShortLine(instrument.toString() + "_ASK_" + tick.getTime(), prev_tick.getTime(), prev_tick.getAsk(), tick.getTime(), tick.getAsk());
            lineAsk.setColor(askColor);
            chart.addToMainChart(lineAsk);
            IShortLineChartObject lineBid = chart.getChartObjectFactory().createShortLine(instrument.toString() + "_BID_" + tick.getTime(), prev_tick.getTime(), prev_tick.getBid(), tick.getTime(), tick.getBid());
            lineBid.setColor(bidColor);
            chart.addToMainChart(lineBid);
        }
        prev_tick = tick;
    }

    public void drawTicks(List<SingleTick> ticks) {
        if (chart != null && ticks != null && !ticks.isEmpty()) {
            for (ITick tick : ticks) {
                drawTick1(tick);
            }
            prev_tick = null;
        }
    }

    public void drawTicks1(List<SingleTick> ticks) {
        if (chart != null && ticks != null && !ticks.isEmpty()) {
            IPolyLineChartObject lineAsk = chart.getChartObjectFactory().createPolyLine(instrument.toString() + "_ASK_" + ticks.get(0).getTime());
            IPolyLineChartObject lineBid = chart.getChartObjectFactory().createPolyLine(instrument.toString() + "_BID_" + ticks.get(0).getTime());
            for (ITick tick : ticks) {
                lineAsk.addNewPoint(tick.getTime(), tick.getAsk());
                lineBid.addNewPoint(tick.getTime(), tick.getBid());
            }
            lineAsk.setColor(askColor);
            chart.addToMainChart(lineAsk);
            lineBid.setColor(bidColor);
            chart.addToMainChart(lineBid);
        }
    }

    public void deleteTick(ITick tick) {
        if (chart != null && tick != null) {
            chart.remove(instrument.toString() + "_ASK_" + tick.getTime());
            chart.remove(instrument.toString() + "_BID_" + tick.getTime());
        }
    }

    public void deleteTicks(List<SingleTick> ticks) {
        if (chart != null && ticks != null && !ticks.isEmpty()) {
            for (ITick tick : ticks) {
                deleteTick(tick);
            }
        }
    }

    @Override
    public void onAccount(IAccount arg0) {
    }

    @Override
    public void onBar(Instrument instrument, Period period, IBar bar1, IBar bar2) {
    }

    @Override
    public void onMessage(IMessage message) {
    }

    @Override
    public void onStart(IContext context) throws JFException {
        System.gc();
        this.context = context;
        instrument = instrument.EURUSD;
        history = context.getHistory();
        chart = context.getChart(instrument);
        chart.removeAll();
        this.askColor = new Color(0xA6FFA6);
        this.bidColor = new Color(0xFFCCCC);
    }

    @Override
    public void onStop() {
        System.gc();
    }

    @Override
    public void onTick(Instrument instrument, ITick tick) throws JFException {
        if (instrument == this.instrument) {
            IChartObject vLine = chart.draw("vLine", IChart.Type.VLINE, tick.getTime(), 0);
            vLine.setColor(Color.RED);
            ITick lastTick = history.getLastTick(instrument);
            list = history.getTicks(instrument, lastTick.getTime() - 600000, lastTick.getTime());
            for (ITick tempTick : list) {
                SingleTick newTick = new SingleTick(tempTick.getTime() + 600000, tempTick.getAsk(), tempTick.getAskVolume(), tempTick.getBid(), tempTick.getBidVolume());
                futureList.add(newTick);
            }
            deleteTicks(preveriosList);
            List<SingleTick> newFutureList = futureList;
            futureList = new ArrayList<SingleTick>();
            prev_tick = newFutureList.get(0);
            drawTicks(newFutureList);
            preveriosList = newFutureList;
        }
    }
}
