using Managing.Core.FixedSizedQueue;
using Managing.Domain.Bots;
using Managing.Domain.Candles;
using Managing.Domain.MoneyManagements;
using Managing.Domain.Strategies;
using Managing.Domain.Strategies.Base;
using Managing.Domain.Trades;
using Managing.Domain.Users;
using static Managing.Common.Enums;

namespace Managing.Application.Abstractions
{
    public interface ITradingBot : IBot
    {
        HashSet<Signal> Signals { get; set; }
        List<Position> Positions { get; set; }
        FixedSizeQueue<Candle> OptimizedCandles { get; set; }
        HashSet<Candle> Candles { get; set; }
        Timeframe Timeframe { get; set; }
        HashSet<IStrategy> Strategies { get; set; }
        Ticker Ticker { get; }
        string ScenarioName { get; }
        string AccountName { get; }
        bool IsForWatchingOnly { get; set; }
        MoneyManagement MoneyManagement { get; set; }
        BotType BotType { get; set; }
        Dictionary<DateTime, decimal> WalletBalances { get; set; }
        Dictionary<StrategyType, StrategiesResultBase> StrategiesValues { get; set; }
        User User { get; set; }
        string Identifier { get; set; }

        Task Run();
        Task ToggleIsForWatchOnly();
        int GetWinRate();
        decimal GetProfitAndLoss();
        decimal GetTotalFees();
        void LoadStrategies(IEnumerable<IStrategy> strategies);
        void LoadScenario(string scenarioName);
        void UpdateStrategiesValues();
        Task LoadAccount();
    }
}