using System.Collections.Concurrent;
using System.Text.Json;
using Beam.Abstractions;
using Beam.Models;

namespace Beam.Fluent;

internal sealed class DownloadStage<OutType>(DownloadEnumerable<OutType> download) : IDownloadStage<OutType> {
    private IAsyncEnumerable<Ordered<OutType>> _download = download;

    public DownloadEnumerable<OutType> AsAsyncEnumerable() {
        return new DownloadEnumerable<OutType>(_download.GetAsyncEnumerator());
    }

    private async IAsyncEnumerable<Ordered<OutType>> _SaveToDirectory(string dir) {
        Directory.CreateDirectory(dir);
        await foreach (var download in _download) {
            await System.IO.File.WriteAllTextAsync(
                Path.Combine(dir, $"{Path.GetRandomFileName()}.{download.Order}.json"),
                JsonSerializer.Serialize(dir));
            yield return download;
        }
    }

    public IDownloadStage<OutType> SaveToDirectory(string dir) {
        _download = _SaveToDirectory(dir);
        return this;
    }

    public IDownloadStage<OutType> SaveToFiles(IEnumerable<string> files) {
        throw new NotImplementedException();
    }

    public IDownloadStage<OutType> SaveToMemory(ConcurrentBag<OutType> bag) {
        throw new NotImplementedException();
    }

    public void WaitForDownload() {
        throw new NotImplementedException();
    }

    public Task WaitForDownloadAsync() {
        throw new NotImplementedException();
    }
}