package com.nanri.aiimage.modules.brand.model.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.util.List;

@Data
@Schema(description = "单个品牌文件结果分片。前端只需按品牌提交保留品牌、不符合品牌、查询失败品牌；后端会基于创建任务时缓存的原始行数据生成最终结果文件。")
public class BrandCrawlResultFileDto {

    @NotBlank(message = "fileUrl 不能为空")
    @Schema(description = "源文件 OSS 链接，必须与创建任务时的文件项一一对应。")
    private String fileUrl;

    @Schema(description = "原始文件名。为空时会回退使用任务创建时记录的 originalFilename。")
    private String originalFilename;

    @Schema(description = "相对路径。创建任务时可传；当前仅用于记录来源信息，最终 zip 不再恢复目录层级。")
    private String relativePath;

    @Schema(description = "主 sheet 名称。为空时默认输出为 Sheet1。")
    private String mainSheetName;

    @NotNull(message = "chunkIndex 不能为空")
    @Schema(description = "当前分片序号，从 1 开始。", example = "1")
    private Integer chunkIndex;

    @NotNull(message = "chunkTotal 不能为空")
    @Schema(description = "当前文件总分片数。", example = "10")
    private Integer chunkTotal;

    @Schema(description = "当前文件总行数。后端据此展示精确行级进度。", example = "1000")
    private Integer totalLines;

    @Schema(description = "本批处理后应保留的品牌列表。仅用于后端累计进度，不需要回传整行数据。")
    private List<String> keptRows;

    @Valid
    @Schema(description = "本批处理后判定为不符合品牌的记录列表。会写入“不符合品牌” sheet；删除主 sheet 数据时仅按 brand 字段匹配删除。")
    private List<BrandInvalidBrandDto> invalidBrands;

    @Schema(description = "本批查询失败的品牌列表。后端会写入“查询失败品牌” sheet。")
    private List<String> queryFailedBrands;
}
