using System.Data;

using CSharpFunctionalExtensions;

using Monitoring.Features.Reports.Contracts;
using Monitoring.Features.Reports.FileBuilders;

namespace Monitoring.Features.Reports;

public class FileBuilderFactory
{
	/// <summary>
	/// Создает файл из данных в указанном формате.
	/// </summary>
	/// <param name="type">Тип файла.</param>
	/// <param name="data">Таблица данных.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	/// <returns>Файл в виде массива байт.</returns>
	public async Task<Result<byte[]>> CreateFile(FileType type, DataTable table, CancellationToken cancellationToken)
	{
		IFileBuilder? fileFactory = type switch
		{
			FileType.Excel => new ExcelFileBuilder(),
			FileType.Pdf => new PdfFileBuilder(),
			FileType.Zip => new ZipFileBuilder(),
			_ => null,
		};

		return fileFactory is null
			? Result.Failure<byte[]>("File factory is not implemented")
			: await fileFactory.Create(table, cancellationToken);
	}
}