package com.gzzm.lobster.run;

import net.cyan.thunwind.annotation.ColumnDescription;
import net.cyan.thunwind.annotation.Entity;
import net.cyan.thunwind.annotation.Index;

import java.util.Date;

/**
 * Durable projection of one run's observable stream.
 *
 * <p>SSE is only a delivery channel. This table lets a reconnecting client replay
 * events it missed without changing backend task execution.
 */
@Entity(table = "AI_RUN_STREAM_EVENT", keys = "eventId")
@Index(name = "uk_ai_run_stream_seq", unique = true, columns = {"runId", "seq"})
public class RunStreamEvent {

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

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

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

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

    @ColumnDescription(type = "number(12)")
    private Long seq;

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

    @ColumnDescription(type = "blob")
    private String payloadJson;

    private Date createTime;

    public String getEventId() { return eventId; }
    public void setEventId(String eventId) { this.eventId = eventId; }
    public String getRunId() { return runId; }
    public void setRunId(String runId) { this.runId = runId; }
    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 Long getSeq() { return seq; }
    public void setSeq(Long seq) { this.seq = seq; }
    public String getEventType() { return eventType; }
    public void setEventType(String eventType) { this.eventType = eventType; }
    public String getPayloadJson() { return payloadJson; }
    public void setPayloadJson(String payloadJson) { this.payloadJson = payloadJson; }
    public Date getCreateTime() { return createTime; }
    public void setCreateTime(Date createTime) { this.createTime = createTime; }
}
