using Managing.Domain.Accounts;
using Managing.Domain.Candles;
using Managing.Domain.Statistics;
using Managing.Domain.Trades;
using static Managing.Common.Enums;

namespace Managing.Infrastructure.Exchanges.Abstractions;

public interface IExchangeProcessor
{
    public TradingExchanges Exchange();
    void LoadClient(Account account);
    Task<Trade> OpenTrade(
    Account account,
    Ticker ticker,
    TradeDirection direction,
    decimal price,
    decimal quantity,
    decimal? leverage = null,
    TradeType tradeType = TradeType.Limit,
    bool reduceOnly = false,
    bool isForPaperTrading = false,
    DateTime? currentDate = null,
    bool ioc = true,
    decimal? stopLossPrice = null,
    decimal? takeProfitPrice = null);
    Task<decimal> GetBalance(Account account, bool isForPaperTrading = false);
    Task<List<Balance>> GetBalances(Account account, bool isForPaperTrading = false);
    Task<decimal> GetPrice(Account account, Ticker ticker, DateTime date);
    Task<Trade> GetTrade(Account account, string order, Ticker ticker);
    Task<List<Candle>> GetCandles(Account account, Ticker ticker, DateTime startDate, Timeframe interval);
    decimal GetVolume(Account account, Ticker ticker);
    Task<List<Trade>> GetTrades(Account account, Ticker ticker);
    Task<bool> CancelOrder(Account account, Ticker ticker);
    decimal GetFee(Account account, bool isForPaperTrading = false);
    Task<Candle> GetCandle(Account account, Ticker ticker, DateTime date);
    Task<decimal> GetQuantityInPosition(Account account, Ticker ticker);
    Orderbook GetOrderbook(Account account, Ticker ticker);
    Task<List<Trade>> GetOrders(Account account, Ticker ticker);
    Task<Trade> GetTrade(string reference, string orderId, Ticker ticker);
    Task<List<FundingRate>> GetFundingRates();
    Task<IEnumerable<Position>> GetPositions(Account account);
}
