/**
 * @ProjectName: 智慧评标-主观分助手
 * @Package: com.zhpb.gdyd_zhpb_zgf.entity.mysql
 * @ClassName: FileType
 * @Description: 文件类型实体类，映射t_file_type表，存储文件类型信息（如：投标文件、采购文件、结果文件等）
 * @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_type")
@Data
public class FileType {

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

    /**
     * 文件类型代码（唯一，如：tender, purchase, result等）
     */
    @Column(name = "type_code", unique = true, nullable = false, length = 64)
    private String typeCode;

    /**
     * 文件类型名称（如：投标文件、采购文件、结果文件等）
     */
    @Column(name = "type_name", nullable = false, length = 128)
    private String typeName;

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

    /**
     * 识别关键词（JSON格式，用于自动识别文件类型）
     * 例如：["投标", "标书", "tender"] 或 ["采购", "purchase", "采购文件"]
     */
    @Column(name = "keywords", columnDefinition = "TEXT")
    private String keywords;

    /**
     * 文件扩展名（JSON格式，可选，如：["pdf", "doc", "docx"]）
     */
    @Column(name = "file_extensions", columnDefinition = "TEXT")
    private String fileExtensions;

    /**
     * 优先级（数字越大优先级越高，用于匹配时优先使用）
     */
    @Column(name = "priority")
    private Integer priority = 0;

    /**
     * 是否启用
     */
    @Column(name = "enabled", nullable = false)
    private Boolean enabled = true;

    /**
     * 创建时间
     */
    @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.typeCode == null || this.typeCode.isEmpty()) {
            // 如果没有提供typeCode，从typeName生成
            this.typeCode = generateTypeCode(this.typeName);
        }
    }

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

    /**
     * 从类型名称生成类型代码
     */
    private String generateTypeCode(String typeName) {
        if (typeName == null || typeName.isEmpty()) {
            return "unknown";
        }
        // 转换为小写，替换空格和下划线为连字符
        return typeName.toLowerCase()
                .replaceAll("\\s+", "_")
                .replaceAll("[^a-z0-9_]", "");
    }
}

