/**
 * @ProjectName: 智慧评标-主观分助手
 * @Package: com.zhpb.gdyd_zhpb_zgf.entity.pgsql
 * @ClassName: PdfVector
 * @Description: PDF向量化实体类，映射t_pdf_vector表，存储PDF文件的向量化结果（使用PostgreSQL的pgvector扩展）
 * @Author: 张志锋
 * @Date: 2025-10-31
 * @Version: 1.0
 * @Copyright: © 2025 智慧评标-主观分助手
 */
package com.zhpb.gdyd_zhpb_zgf.entity.pgsql;

import jakarta.persistence.*;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * PDF向量化实体类
 */
@Entity
@Table(name = "t_pdf_vector")
@Data
public class PdfVector {

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

    /**
     * PDF文件路径
     */
    @Column(name = "file_path", nullable = false, length = 1000)
    private String filePath;

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

    /**
     * PDF原始文本内容（可存储部分内容或摘要）
     */
    @Column(name = "content", columnDefinition = "TEXT")
    private String content;

    /**
     * 向量化后的向量（使用pgvector类型存储）
     * 注意：Hibernate无法自动创建vector类型，表通过原生SQL手动创建
     * 此字段不参与Hibernate的DDL，完全通过原生SQL操作
     */
    @Transient
    private String vectorText;
    
    /**
     * 向量数组（临时字段，不直接存储到数据库，通过vectorText间接存储）
     */
    @Transient
    private float[] vector;
    
    /**
     * 设置向量数组（自动转换为字符串）
     */
    public void setVector(float[] vector) {
        this.vector = vector;
        if (vector != null && vector.length > 0) {
            StringBuilder sb = new StringBuilder("[");
            for (int i = 0; i < vector.length; i++) {
                if (i > 0) {
                    sb.append(",");
                }
                sb.append(vector[i]);
            }
            sb.append("]");
            this.vectorText = sb.toString();
        }
    }
    
    /**
     * 获取向量数组（从字符串解析）
     */
    public float[] getVector() {
        if (vector == null && vectorText != null && !vectorText.isEmpty()) {
            try {
                String content = vectorText.trim();
                if (content.startsWith("[") && content.endsWith("]")) {
                    content = content.substring(1, content.length() - 1);
                    String[] parts = content.split(",");
                    vector = new float[parts.length];
                    for (int i = 0; i < parts.length; i++) {
                        vector[i] = Float.parseFloat(parts[i].trim());
                    }
                }
            } catch (Exception e) {
                // 解析失败
            }
        }
        return vector;
    }
    
    /**
     * 向量字符串格式（用于原生SQL查询）
     * 格式：[0.1,0.2,0.3,...]
     */
    @Transient
    public String getVectorString() {
        if (vector == null || vector.length == 0) {
            return "[]";
        }
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < vector.length; i++) {
            if (i > 0) {
                sb.append(",");
            }
            sb.append(vector[i]);
        }
        sb.append("]");
        return sb.toString();
    }

    /**
     * 向量维度
     */
    @Column(name = "dimension", nullable = false)
    private Integer dimension;

    /**
     * 文件ID（关联t_file表的file_id）
     */
    @Column(name = "file_id", length = 64)
    private String fileId;

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

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

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

    /**
     * 创建时间
     */
    @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();
    }

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

