
// 








namespace SafeCampus.System;

/// <summary>
/// 导入服务
/// </summary>
public interface IImportExportService : ITransient
{
    /// <summary>
    /// 导出数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="data">数据</param>
    /// <param name="fileName">文件名</param>
    /// <returns>文件流</returns>
    Task<FileStreamResult> Export<T>(List<T> data, string fileName) where T : class, new();

    /// <summary>
    /// 获取本地模板
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="templateFolder">模板文件夹路径:默认wwwroot下的Template</param>
    /// <returns>文件流</returns>
    FileStreamResult GenerateLocalTemplate(string fileName, string templateFolder = "Template");

    /// <summary>
    /// 生成模板
    /// </summary>
    /// <typeparam name="T">实体类</typeparam>
    /// <param name="fileName">文件名</param>
    /// <returns>文件流</returns>
    Task<FileStreamResult> GenerateTemplate<T>(string fileName) where T : class, new();

    /// <summary>
    /// 获取导入预览
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="file">文件</param>
    /// <returns>导入预览结果</returns>
    Task<ImportPreviewOutput<T>> GetImportPreview<T>(IFormFile file) where T : ImportTemplateInput, new();

    /// <summary>
    /// 获取预计导入结果
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="data">数据</param>
    /// <param name="importData">成功导入数据</param>
    /// <returns>预计导入结果</returns>
    ImportResultOutPut<T> GetImportResultPreview<T>(List<T> data, out List<T> importData) where T : ImportTemplateInput;

    /// <summary>
    /// 导入文件验证
    /// </summary>
    /// <param name="file">文件</param>
    /// <param name="maxSize">文件最大体积(M)</param>
    /// <param name="allowTypes">允许的格式</param>
    void ImportVerification(IFormFile file, int maxSize = 30, string[] allowTypes = null);

    /// <summary>
    /// 模板数据验证
    /// </summary>
    /// <typeparam name="T">模板类实体</typeparam>
    /// <param name="importResult">结果</param>
    /// <returns>导入预览数据</returns>
    ImportPreviewOutput<T> TemplateDataVerification<T>(ImportResult<T> importResult) where T : ImportTemplateInput;
}
