using Mlaumcherb.Client.Avalonia.зримое;
using Mlaumcherb.Client.Avalonia.классы;
using Mlaumcherb.Client.Avalonia.холопы;
using static Mlaumcherb.Client.Avalonia.сеть.NetworkHelper;

namespace Mlaumcherb.Client.Avalonia.сеть.TaskFactories;

public class VersionJarDownloadTaskFactory : INetworkTaskFactory
{
    private GameVersionDescriptor _descriptor;
    private IOPath _filePath;
    
    public VersionJarDownloadTaskFactory(GameVersionDescriptor descriptor)
    {
        _descriptor = descriptor;
        _filePath = PathHelper.GetVersionJarFilePath(_descriptor.id);
    }

    public Task<NetworkTask?> CreateAsync(bool checkHashes)
    {
        NetworkTask? networkTask = null;
        if (!CheckFiles(checkHashes))
        {
            networkTask = new NetworkTask(
                $"game version jar '{_descriptor.id}'",
                GetTotalSize(),
                Download
            );
        }
        
        return Task.FromResult(networkTask);
    }

    private bool CheckFiles(bool checkHashes)
    {
        return HashHelper.CheckFileSHA1(_filePath, _descriptor.downloads?.client.sha1, checkHashes);
    }

    private long GetTotalSize()
    {
        if(_descriptor.downloads is null)
            return 0;
        return _descriptor.downloads.client.size;
    }
    
    private async Task Download(NetworkProgressReporter pr, CancellationToken ct)
    {
        if (_descriptor.downloads is null)
            throw new Exception($"can't download game version jar '{_descriptor.id}' because it has no download url");
        
        LauncherApp.Logger.LogInfo(nameof(NetworkHelper), $"started downloading game version jar '{_descriptor.id}'");
        await DownloadFile(_descriptor.downloads.client.url, _filePath, ct, pr.AddBytesCount);
        LauncherApp.Logger.LogInfo(nameof(NetworkHelper), $"finished downloading game version jar '{_descriptor.id}'");
    }
}