package com.dukascopy;

import com.dukascopy.api.*;
import com.dukascopy.api.CustomIndicators;
import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IConsole;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IEngine;
import com.dukascopy.api.IHistory;
import com.dukascopy.api.IIndicators;
import com.dukascopy.api.IMessage;
import com.dukascopy.api.IStrategy;
import com.dukascopy.api.ITick;
import com.dukascopy.api.IUserInterface;
import com.dukascopy.api.Instrument;
import com.dukascopy.api.JFException;
import com.dukascopy.api.OfferSide;
import com.dukascopy.api.Period;
import com.dukascopy.api.RequiresFullAccess;
import com.dukascopy.api.feed.IFeedDescriptor;
import com.dukascopy.api.feed.util.TimePeriodAggregationFeedDescriptor;
import com.dukascopy.api.indicators.IIndicator;
import com.dukascopy.api.indicators.IIndicatorCalculator;
import java.text.DecimalFormat;
import java.util.*;

@RequiresFullAccess
@CustomIndicators("C:\\indicators\\TradersDynamicIndex.jfx")
public class Strategy implements IStrategy {
    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IContext context;
    private IIndicators indicators;
    private IUserInterface userInterface;

    public void onStart(IContext context) throws JFException {
        this.engine = context.getEngine();
        this.console = context.getConsole();
        this.history = context.getHistory();
        this.context = context;
        this.indicators = context.getIndicators();
        this.userInterface = context.getUserInterface();

        String indPath = getClass().getAnnotation(CustomIndicators.class).value();
        IIndicator indicator = indicators.getIndicatorByPath(indPath);
        if(indicator == null){
            console.getErr().println("Indicator by path "+indPath+" not registered!");
            context.stop();
        }

        tdi();
    }

    public void tdi() throws JFException {
        IFeedDescriptor feedDescriptor = new TimePeriodAggregationFeedDescriptor(
            Instrument.EURUSD,
            Period.ONE_MIN,
            OfferSide.ASK,
            Filter.NO_FILTER);

        ITick tick = history.getLastTick(Instrument.EURUSD);
        long calculateTime = history.getBarStart(Period.ONE_MIN, tick.getTime());

        OfferSide[] offerSides = new OfferSide[] {OfferSide.BID };
        IIndicators.AppliedPrice[] appliedPrices = new IIndicators.AppliedPrice[] {IIndicators.AppliedPrice.WEIGHTED_CLOSE };
        Object[] optInputs = new Object[] {
            13,
            2,
            IIndicators.MaType.SMA.ordinal(),
            7,
            IIndicators.MaType.SMA.ordinal(),
            34,
            IIndicators.MaType.SMA.ordinal(),
            false
        };

        Object[] results = indicators.calculateIndicator(
            feedDescriptor,
            offerSides,
            "TDI",
            appliedPrices,
            optInputs,
            3,
            calculateTime,
            0
        );

        DecimalFormat decimalFormat = new DecimalFormat("#.#######");
        for(int i = 4; i >= 0; i--) {
            int len2 = ((double[]) results[i]).length - 1;
            for(int j = len2; j >= 0; j--) {
                double val = ((double[]) results[i])[j];
                String print = "["+ j+ "]"+ decimalFormat.format(val);
                console.getOut().println(print);
            }
            console.getOut().println("output "+ i);
        }

    }


    public void onAccount(IAccount account) throws JFException {
    }

    public void onMessage(IMessage message) throws JFException {
    }

    public void onStop() throws JFException {
    }

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

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