using aeqw89.DataKeys;
using Beam.Abstractions;
using Beam.Data;
using Beam.Downloaders;
using Beam.Dynamic;
using Beam.Models;

namespace Beam.Fluent;

public static class FluentDownload {
    public static ITransformStage<OutType> Links<OutType>(params IEnumerable<string> links) {
        return new TransformStage<OutType>(new DownloadContextBuilder()
            .WithLinks(links));
    }

    public static ITransformStage< OutType>
        ResourceDefinition< OutType>(ResourceDefinition definition) {
        if (definition.Location.States.Count == 0)
            throw new ArgumentException(Exceptions.Exceptions.resource_definition_invalid_states_count, nameof(definition));
        var linkGenerator = new OrderedLinkGenerator(definition.Location.Segments, (NumberedStateChanger)definition.Location.StateChanger.Behavior,
            definition.Location.States.First().Copy());
        return new TransformStage< OutType>(new DownloadContextBuilder()
            .WithLinks(StringEnumerable.FromGenerator(linkGenerator!)));
    }
    
    public static ITransformStage< OutType> FromContext< OutType>(DownloadContext existing) {
        return new TransformStage< OutType>(DownloadContextBuilder.FromContext(existing));
    }
}