import com.cryptostruct.commons.annotations.ExportStrategy;
import com.cryptostruct.sdk.StopReason;
import com.cryptostruct.sdk.Strategy;
import com.cryptostruct.sdk.StrategyContext;
import com.cryptostruct.sdk.StrategyTimer;
import com.cryptostruct.sdk.instruments.DataInstrument;
import com.cryptostruct.sdk.instruments.TradingInstrument;
import com.cryptostruct.sdk.orders.*;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@ExportStrategy(name = "ExampleStrategy")
public class ExampleStrategy implements Strategy {
    private StrategyContext context;

    public ExampleStrategy(StrategyContext context) {
        this.context = context;
    }

    @Override
    public void onStarted() {
        log.info("onStarted()");
    }

    @Override
    public void onStop(StopReason stopReason, String message) {
        log.info("onStop(): {}", message);
    }

    @Override
    public void onMarketDataState(DataInstrument instrument) {
        log.info("onMarketDataState()");
    }

    @Override
    public void onInstrumentSnapshot(DataInstrument instrument) {
        log.info("onInstrumentSnapshot()");
        instrument.getSnapshot().printBook(5, log::info);
    }

    @Override
    public void onInstrumentTrades(DataInstrument instrument) {
        log.info("onInstrumentTrades()");
        instrument.getLastTrades().forEach(trade -> log.info(trade.toString()));
    }

    @Override
    public void onInstrumentPosition(TradingInstrument instrument) {
        log.info("onInstrumentPosition()");
    }

    @Override
    public void onOrderFill(Order order) {
        log.info("onOrderFill: {}", order.getDescriptiveString());
    }

    @Override
    public void onOrderUpdate(Order order) {
        log.info("onOrderUpdate(): {}", order.getDescriptiveString());
    }

    @Override
    public void onOrderError(Order order, OrderError orderError) {
        log.error("onOrderError(): {}", orderError.getMessage());
    }

    @Override
    public void onHeartbeat() {

    }

    @Override
    public void onTimer(StrategyTimer timer) {

    }
}
