using Managing.Domain.Backtests;
using Managing.Domain.Bots;
using Managing.Domain.Candles;
using Managing.Domain.Users;

namespace Managing.Application.Abstractions.Services
{
    public interface IBacktester
    {
        /// <summary>
        /// Runs a unified trading bot backtest with the specified configuration and date range.
        /// Automatically handles ScalpingBot and FlippingBot behavior based on config.BotType.
        /// </summary>
        /// <param name="config">The trading bot configuration</param>
        /// <param name="startDate">The start date for the backtest</param>
        /// <param name="endDate">The end date for the backtest</param>
        /// <param name="user">The user running the backtest</param>
        /// <param name="save">Whether to save the backtest results</param>
        /// <param name="initialCandles">Optional pre-loaded candles</param>
        /// <returns>The backtest results</returns>
        Task<Backtest> RunTradingBotBacktest(
            TradingBotConfig config,
            DateTime startDate,
            DateTime endDate,
            User user = null,
            bool save = false,
            List<Candle>? initialCandles = null);

        /// <summary>
        /// Runs a unified trading bot backtest with pre-loaded candles.
        /// Automatically handles ScalpingBot and FlippingBot behavior based on config.BotType.
        /// </summary>
        /// <param name="config">The trading bot configuration</param>
        /// <param name="candles">The candles to use for backtesting</param>
        /// <param name="user">The user running the backtest</param>
        /// <returns>The backtest results</returns>
        Task<Backtest> RunTradingBotBacktest(
            TradingBotConfig config,
            List<Candle> candles,
            User user = null);

        // Legacy methods - maintained for backward compatibility
        Task<Backtest> RunScalpingBotBacktest(
            TradingBotConfig config,
            DateTime startDate,
            DateTime endDate,
            User user = null,
            bool save = false,
            List<Candle>? initialCandles = null);

        Task<Backtest> RunFlippingBotBacktest(
            TradingBotConfig config,
            DateTime startDate,
            DateTime endDate,
            User user = null,
            bool save = false,
            List<Candle>? initialCandles = null);

        bool DeleteBacktest(string id);
        bool DeleteBacktests();

        Task<Backtest> RunScalpingBotBacktest(
            TradingBotConfig config,
            List<Candle> candles,
            User user = null);

        Task<Backtest> RunFlippingBotBacktest(
            TradingBotConfig config,
            List<Candle> candles,
            User user = null);

        // User-specific operations
        Task<IEnumerable<Backtest>> GetBacktestsByUser(User user);
        Backtest GetBacktestByIdForUser(User user, string id);
        bool DeleteBacktestByUser(User user, string id);
        bool DeleteBacktestsByUser(User user);
    }
}