using Beam.Abstractions;
using Beam.Downloaders;
using Beam.Models;
using Beam.Playwright;
using Beam.Stealth;

namespace Beam.Fluent;

public interface IContextStage<OutType> {
    IContextStage<OutType> Configure(Action<DownloadContextBuilder> configure);
    IContextStage<OutType> WithParallelism(int degree);
    IContextStage<OutType> WithTimeout(TimeSpan timeout);
    IContextStage<OutType> WithRetryReporter(IProgress<IRetryReport> reporter);
    IContextStage<OutType> UseFragments();
    IContextStage<OutType> UsePlaywright(PlaywrightAsyncManipulator manipulator);
    IContextStage<OutType> UseStealth(StealthAsyncManipulator manipulator, StealthConfig config);
    IContextStage<OutType> ConfigureUnitDownloaderOptions(
        Action<UnitDownloaderOptionsBuilder<OutType>> configure);
    DownloadEnumerable<OutType> Build();
}