package com.gzzm.lobster.workspace;

import com.gzzm.lobster.common.ResourceSourceType;
import com.gzzm.lobster.common.WorkspaceResourceStatus;
import net.cyan.thunwind.annotation.ColumnDescription;
import net.cyan.thunwind.annotation.Entity;
import net.cyan.thunwind.annotation.Index;

import java.util.Date;

/**
 * Workspace 中的资源条目 / A resource entry visible inside a workspace.
 *
 * <p>统一建模 OA 文件引用、Artifact、文档工坊文档。通过 sourceType + sourceId
 * 标识真实资源。
 *
 * <p>Unified record for OA file reference, artifact and workshop doc.
 * Real resource identified by {@code sourceType + sourceId}.
 */
@Entity(table = "AI_WORKSPACE_RESOURCE", keys = "resourceId")
public class WorkspaceResource {

    @ColumnDescription(type = "varchar(40)")
    private String resourceId;

    @Index
    @ColumnDescription(type = "varchar(40)", nullable = false)
    private String workspaceId;

    @Index
    @ColumnDescription(type = "varchar(40)", nullable = false)
    private String threadId;

    @ColumnDescription(type = "varchar(40)", nullable = false)
    private String userId;

    private ResourceSourceType sourceType;

    /** Artifact id / OA 文件 id / Workshop doc id */
    @ColumnDescription(type = "varchar(80)", nullable = false)
    private String sourceId;

    @ColumnDescription(type = "varchar(300)")
    private String displayName;

    @ColumnDescription(type = "varchar(80)")
    private String mimeType;

    /** 原始 artifactType（如果是 ARTIFACT 来源）*/
    @ColumnDescription(type = "varchar(40)")
    private String artifactType;

    /** 来源说明：user_reference / assistant_output / workshop_open / oa_quote / etc. */
    @ColumnDescription(type = "varchar(40)")
    private String origin;

    /** 生命周期状态 / lifecycle status, see {@link WorkspaceResourceStatus}. */
    private WorkspaceResourceStatus status;

    /**
     * 自由扩展元信息 JSON / Free-form metadata JSON.
     *
     * <p>USER_UPLOAD 场景下存放：
     * {@code {origRef, mdRef, outlineRef, sizeBytes, kind, outlineSummary: {...}, topSections: [...]}}。
     * 其它 sourceType 目前不使用该字段。
     */
    @ColumnDescription(type = "varchar(4000)")
    private String metadataJson;

    private Date createTime;
    private Date updateTime;

    public WorkspaceResource() {}

    public String getResourceId() { return resourceId; }
    public void setResourceId(String resourceId) { this.resourceId = resourceId; }
    public String getWorkspaceId() { return workspaceId; }
    public void setWorkspaceId(String workspaceId) { this.workspaceId = workspaceId; }
    public String getThreadId() { return threadId; }
    public void setThreadId(String threadId) { this.threadId = threadId; }
    public String getUserId() { return userId; }
    public void setUserId(String userId) { this.userId = userId; }
    public ResourceSourceType getSourceType() { return sourceType; }
    public void setSourceType(ResourceSourceType sourceType) { this.sourceType = sourceType; }
    public String getSourceId() { return sourceId; }
    public void setSourceId(String sourceId) { this.sourceId = sourceId; }
    public String getDisplayName() { return displayName; }
    public void setDisplayName(String displayName) { this.displayName = displayName; }
    public String getMimeType() { return mimeType; }
    public void setMimeType(String mimeType) { this.mimeType = mimeType; }
    public String getArtifactType() { return artifactType; }
    public void setArtifactType(String artifactType) { this.artifactType = artifactType; }
    public String getOrigin() { return origin; }
    public void setOrigin(String origin) { this.origin = origin; }
    public WorkspaceResourceStatus getStatus() { return status; }
    public void setStatus(WorkspaceResourceStatus status) { this.status = status; }
    public String getMetadataJson() { return metadataJson; }
    public void setMetadataJson(String metadataJson) { this.metadataJson = metadataJson; }
    public Date getCreateTime() { return createTime; }
    public void setCreateTime(Date createTime) { this.createTime = createTime; }
    public Date getUpdateTime() { return updateTime; }
    public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; }
}
