package com.erp.dataimport.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 导入任务实体
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("import_task")
public class ImportTask {

    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 任务名称
     */
    private String taskName;

    /**
     * 业务类型：goods-商品, customer-客户, supplier-供应商, order-订单, inventory-库存
     */
    private String bizType;

    /**
     * 文件格式：xlsx, xls, csv
     */
    private String fileFormat;

    /**
     * 原始文件名
     */
    private String originalFileName;

    /**
     * 文件存储路径
     */
    private String filePath;

    /**
     * 文件大小（字节）
     */
    private Long fileSize;

    /**
     * 总行数
     */
    private Integer totalRows;

    /**
     * 成功行数
     */
    private Integer successRows;

    /**
     * 失败行数
     */
    private Integer failRows;

    /**
     * 跳过行数
     */
    private Integer skipRows;

    /**
     * 任务状态：pending-待处理, processing-处理中, completed-已完成, failed-失败, partial-部分成功
     */
    private String status;

    /**
     * 租户ID
     */
    private Long tenantId;

    /**
     * 创建人ID
     */
    private Long creatorId;

    /**
     * 创建人名称
     */
    private String creatorName;

    /**
     * 处理完成时间
     */
    private LocalDateTime finishTime;

    /**
     * 错误信息摘要
     */
    private String errorSummary;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;

    /**
     * 删除时间（逻辑删除）
     */
    @TableLogic
    private LocalDateTime deletedAt;

    // ==================== 辅助方法 ====================

    public boolean isPending() {
        return "pending".equals(status);
    }

    public boolean isProcessing() {
        return "processing".equals(status);
    }

    public boolean isCompleted() {
        return "completed".equals(status);
    }

    public boolean isFailed() {
        return "failed".equals(status);
    }

    public boolean isPartial() {
        return "partial".equals(status);
    }

    public boolean hasErrors() {
        return failRows != null && failRows > 0;
    }

    public double getSuccessRate() {
        if (totalRows == null || totalRows == 0) return 0.0;
        if (successRows == null) return 0.0;
        return (double) successRows / totalRows * 100;
    }
}
