using Managing.Application.Abstractions.Repositories;
using Managing.Application.Abstractions.Shared;
using Managing.Common;
using Managing.Domain.Backtests;
using Managing.Domain.Bots;
using Managing.Domain.Candles;
using Managing.Domain.Users;
namespace Managing.Application.Abstractions.Services
{
public interface IBacktester
{
///
/// Runs a trading bot backtest with the specified configuration and date range.
/// Automatically handles different bot types based on config.BotType.
/// Returns a LightBacktest for efficient Orleans serialization.
///
/// The trading bot configuration (must include Scenario object or ScenarioName)
/// The start date for the backtest
/// The end date for the backtest
/// The user running the backtest (optional)
/// Whether to save the backtest results
/// Whether to include candles and indicators values in the response
/// The request ID to associate with this backtest (optional)
/// Additional metadata to associate with this backtest (optional)
/// The lightweight backtest results
Task RunTradingBotBacktest(
TradingBotConfig config,
DateTime startDate,
DateTime endDate,
User user = null,
bool save = false,
bool withCandles = false,
string requestId = null,
object metadata = null);
///
/// Runs a trading bot backtest with pre-loaded candles.
/// Automatically handles different bot types based on config.BotType.
/// Returns a LightBacktest for efficient Orleans serialization.
///
/// The trading bot configuration (must include Scenario object or ScenarioName)
/// The candles to use for backtesting
/// The user running the backtest (optional)
/// Whether to include candles and indicators values in the response
/// The request ID to associate with this backtest (optional)
/// Additional metadata to associate with this backtest (optional)
/// The lightweight backtest results
Task RunTradingBotBacktest(
TradingBotConfig config,
HashSet candles,
User user = null,
bool withCandles = false,
string requestId = null,
object metadata = null);
// Additional methods for backtest management
Task DeleteBacktestAsync(string id);
bool DeleteBacktests();
IEnumerable GetBacktestsByUser(User user);
Task> GetBacktestsByUserAsync(User user);
IEnumerable GetBacktestsByRequestId(Guid requestId);
Task> GetBacktestsByRequestIdAsync(Guid requestId);
(IEnumerable Backtests, int TotalCount) GetBacktestsByRequestIdPaginated(Guid requestId, int page, int pageSize, string sortBy = "score", string sortOrder = "desc");
Task<(IEnumerable Backtests, int TotalCount)> GetBacktestsByRequestIdPaginatedAsync(Guid requestId, int page, int pageSize, string sortBy = "score", string sortOrder = "desc");
Task GetBacktestByIdForUserAsync(User user, string id);
Task DeleteBacktestByUserAsync(User user, string id);
Task DeleteBacktestsByIdsForUserAsync(User user, IEnumerable ids);
bool DeleteBacktestsByUser(User user);
(IEnumerable Backtests, int TotalCount) GetBacktestsByUserPaginated(
User user,
int page,
int pageSize,
Enums.BacktestSortableColumn sortBy,
string sortOrder = "desc",
BacktestsFilter? filter = null);
Task<(IEnumerable Backtests, int TotalCount)> GetBacktestsByUserPaginatedAsync(
User user,
int page,
int pageSize,
Enums.BacktestSortableColumn sortBy,
string sortOrder = "desc",
BacktestsFilter? filter = null);
Task DeleteBacktestsByRequestIdAsync(Guid requestId);
Task DeleteBacktestsByFiltersAsync(User user, BacktestsFilter filter);
Task InsertBundleBacktestRequestForUserAsync(User user, BundleBacktestRequest bundleRequest, bool saveAsTemplate = false);
Task SaveBundleBacktestRequestAsync(User user, BundleBacktestRequest bundleRequest);
Task CreateJobsForBundleRequestAsync(BundleBacktestRequest bundleRequest);
IEnumerable GetBundleBacktestRequestsByUser(User user);
Task> GetBundleBacktestRequestsByUserAsync(User user);
BundleBacktestRequest? GetBundleBacktestRequestByIdForUser(User user, Guid id);
Task GetBundleBacktestRequestByIdForUserAsync(User user, Guid id);
void UpdateBundleBacktestRequest(BundleBacktestRequest bundleRequest);
Task UpdateBundleBacktestRequestAsync(BundleBacktestRequest bundleRequest);
void DeleteBundleBacktestRequestByIdForUser(User user, Guid id);
Task DeleteBundleBacktestRequestByIdForUserAsync(User user, Guid id);
IEnumerable GetBundleBacktestRequestsByStatus(BundleBacktestRequestStatus status);
Task> GetBundleBacktestRequestsByStatusAsync(BundleBacktestRequestStatus status);
// Admin methods - no user filter
(IEnumerable BundleRequests, int TotalCount) GetBundleBacktestRequestsPaginated(
int page,
int pageSize,
Enums.BundleBacktestRequestSortableColumn sortBy = Enums.BundleBacktestRequestSortableColumn.CreatedAt,
string sortOrder = "desc",
BundleBacktestRequestsFilter? filter = null);
Task<(IEnumerable BundleRequests, int TotalCount)> GetBundleBacktestRequestsPaginatedAsync(
int page,
int pageSize,
Enums.BundleBacktestRequestSortableColumn sortBy = Enums.BundleBacktestRequestSortableColumn.CreatedAt,
string sortOrder = "desc",
BundleBacktestRequestsFilter? filter = null);
Task GetBundleBacktestRequestsSummaryAsync();
// Admin delete methods - no user filter
Task DeleteBundleBacktestRequestByIdAsync(Guid id);
}
}