/**
 * @ProjectName: 智慧评标-主观分助手
 * @Package: com.zhpb.gdyd_zhpb_zgf.entity.mysql
 * @ClassName: File
 * @Description: 文件实体类，映射t_file表，存储文件信息
 * @Author: 张志锋
 * @Date: 2025-11-01
 * @Version: 1.0
 * @Copyright: © 2025 智慧评标-主观分助手
 */
package com.zhpb.gdyd_zhpb_zgf.entity.mysql;

import jakarta.persistence.*;
import lombok.Data;
import java.time.LocalDateTime;

/**
 * 文件实体类
 */
@Entity
@Table(name = "t_file")
@Data
public class File {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 文件ID（业务ID，唯一）
     */
    @Column(name = "file_id", unique = true, nullable = false, length = 64)
    private String fileId;

    /**
     * 项目ID（关联t_project表）
     */
    @Column(name = "project_id", nullable = false, length = 64)
    private String projectId;

    /**
     * 供应商ID（关联t_supplier表）
     */
    @Column(name = "supplier_id", length = 64)
    private String supplierId;

    /**
     * 文件名称
     */
    @Column(name = "file_name", nullable = false, length = 512)
    private String fileName;

    /**
     * 文件路径（完整路径）
     */
    @Column(name = "file_path", nullable = false, columnDefinition = "TEXT")
    private String filePath;

    /**
     * 文件扩展名（pdf, doc, xls等）
     */
    @Column(name = "file_extension", length = 32)
    private String fileExtension;

    /**
     * 文件类型ID（关联t_file_type表）
     */
    @Column(name = "file_type_id")
    private Long fileTypeId;

    /**
     * 文件大小（字节）
     */
    @Column(name = "file_size")
    private Long fileSize;

    /**
     * 文件MD5值
     */
    @Column(name = "file_md5", length = 64)
    private String fileMd5;

    /**
     * 文件状态（uploaded, processed, vectorized, failed等）
     */
    @Column(name = "status", length = 32)
    private String status;

    /**
     * 向量化状态（not_started-未开始, processing-处理中, completed-已完成, failed-失败）
     */
    @Column(name = "vectorization_status", length = 32)
    private String vectorizationStatus = "not_started";

    /**
     * 是否已向量化（兼容字段，根据vectorization_status自动设置）
     */
    @Column(name = "is_vectorized", nullable = false)
    private Boolean isVectorized = false;

    /**
     * 向量化时间
     */
    @Column(name = "vectorized_time")
    private LocalDateTime vectorizedTime;

    /**
     * 向量化数据条数（该文件对应的向量化记录数量）
     */
    @Column(name = "vectorization_count", nullable = false)
    private Integer vectorizationCount = 0;

    /**
     * 目录摘取状态（not_started-未开始, processing-处理中, completed-已完成, failed-失败）
     * 注意：失败且重试次数<3时会重置为 not_started，重试次数>=3时为 failed
     */
    @Column(name = "catalog_extraction_status", length = 32, columnDefinition = "varchar(32) default 'not_started'")
    private String catalogExtractionStatus = "not_started";

    /**
     * 目录摘取重试次数（最多重试3次）
     */
    @Column(name = "catalog_extraction_retry_count", nullable = false, columnDefinition = "integer default 0")
    private Integer catalogExtractionRetryCount = 0;

    /**
     * 目录摘取完成时间
     */
    @Column(name = "catalog_extraction_time")
    private LocalDateTime catalogExtractionTime;

    /**
     * 文件描述
     */
    @Column(name = "description", columnDefinition = "TEXT")
    private String description;

    /**
     * 预览接口URL（用于在线预览，如：/api/v1/files/preview/pdf/{file_id}）
     */
    @Column(name = "preview_path", columnDefinition = "TEXT")
    private String previewPath;

    /**
     * 创建时间
     */
    @Column(name = "create_time", nullable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @Column(name = "update_time")
    private LocalDateTime updateTime;

    @PrePersist
    public void prePersist() {
        this.createTime = LocalDateTime.now();
        this.updateTime = LocalDateTime.now();
        if (this.fileId == null) {
            // 如果没有设置fileId，自动生成UUID
            this.fileId = java.util.UUID.randomUUID().toString().replace("-", "");
        }
    }

    @PreUpdate
    public void preUpdate() {
        this.updateTime = LocalDateTime.now();
    }
}

