package com.erp.report.export.service;

import com.erp.report.export.dto.*;
import org.springframework.scheduling.annotation.Async;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 报表导出服务接口
 * 
 * 功能：
 * - 多格式导出（CSV/Excel/PDF）
 * - 异步导出处理
 * - 导出历史记录管理
 * - 定时导出任务
 */
public interface ReportExportService {

    // ==================== 同步导出接口 ====================

    /**
     * 导出订单
     *
     * @param request 订单导出请求
     * @return 导出响应
     */
    ExportResponse exportOrders(OrderExportRequest request);

    /**
     * 导出商品
     *
     * @param request 商品导出请求
     * @return 导出响应
     */
    ExportResponse exportGoods(GoodsExportRequest request);

    /**
     * 导出库存
     *
     * @param request 库存导出请求
     * @return 导出响应
     */
    ExportResponse exportInventory(InventoryExportRequest request);

    /**
     * 导出供应商
     *
     * @param request 供应商导出请求
     * @return 导出响应
     */
    ExportResponse exportSuppliers(SupplierExportRequest request);

    /**
     * 导出库存报表
     *
     * @param request 库存报表导出请求
     * @return 导出响应
     */
    ExportResponse exportStockReport(OrderExportRequest request);

    /**
     * 导出销售报表
     *
     * @param request 销售报表导出请求
     * @return 导出响应
     */
    ExportResponse exportSalesReport(OrderExportRequest request);

    /**
     * 导出订单报表
     *
     * @param request 订单报表导出请求
     * @return 导出响应
     */
    ExportResponse exportOrderReport(OrderExportRequest request);

    /**
     * 导出采购报表
     *
     * @param request 采购报表导出请求
     * @return 导出响应
     */
    ExportResponse exportPurchaseReport(OrderExportRequest request);

    /**
     * 导出资金报表
     *
     * @param request 资金报表导出请求
     * @return 导出响应
     */
    ExportResponse exportFinanceReport(OrderExportRequest request);

    // ==================== 异步导出接口 ====================

    /**
     * 异步导出订单
     *
     * @param request 订单导出请求
     * @return CompletableFuture 包含导出响应
     */
    @Async
    CompletableFuture<ExportResponse> exportOrdersAsync(OrderExportRequest request);

    /**
     * 异步导出商品
     *
     * @param request 商品导出请求
     * @return CompletableFuture 包含导出响应
     */
    @Async
    CompletableFuture<ExportResponse> exportGoodsAsync(GoodsExportRequest request);

    /**
     * 异步导出库存
     *
     * @param request 库存导出请求
     * @return CompletableFuture 包含导出响应
     */
    @Async
    CompletableFuture<ExportResponse> exportInventoryAsync(InventoryExportRequest request);

    /**
     * 异步导出供应商
     *
     * @param request 供应商导出请求
     * @return CompletableFuture 包含导出响应
     */
    @Async
    CompletableFuture<ExportResponse> exportSuppliersAsync(SupplierExportRequest request);

    // ==================== 导出历史管理 ====================

    /**
     * 获取导出历史记录列表
     *
     * @param tenantId 租户ID
     * @param type 导出类型
     * @param status 状态
     * @param page 页码
     * @param pageSize 每页数量
     * @return 导出历史列表
     */
    List<ExportHistoryResponse> getExportHistory(Long tenantId, ExportType type, ExportStatus status, int page, int pageSize);

    /**
     * 获取导出记录详情
     *
     * @param id 导出记录ID
     * @param tenantId 租户ID
     * @return 导出记录详情
     */
    ExportHistoryResponse getExportById(Long id, Long tenantId);

    /**
     * 删除导出记录
     *
     * @param id 导出记录ID
     * @param tenantId 租户ID
     * @return 是否删除成功
     */
    boolean deleteExport(Long id, Long tenantId);

    /**
     * 获取导出文件下载URL
     *
     * @param id 导出记录ID
     * @param tenantId 租户ID
     * @return 下载URL
     */
    String getDownloadUrl(Long id, Long tenantId);

    // ==================== 定时任务导出 ====================

    /**
     * 创建定时导出任务
     *
     * @param request 导出请求
     * @param cronExpression Cron表达式
     * @return 任务ID
     */
    String createScheduledExport(BaseExportRequest request, String cronExpression);

    /**
     * 取消定时导出任务
     *
     * @param taskId 任务ID
     * @return 是否取消成功
     */
    boolean cancelScheduledExport(String taskId);

    /**
     * 获取租户的定时导出任务列表
     *
     * @param tenantId 租户ID
     * @return 任务列表
     */
    List<String> getScheduledExports(Long tenantId);

    // ==================== 清理和维护 ====================

    /**
     * 清理过期的导出文件
     *
     * @param daysOld 超过多少天的文件将被删除
     * @return 删除的文件数量
     */
    int cleanupExpiredExports(int daysOld);
}
