package com.gzzm.lobster.pending;

import com.gzzm.lobster.common.PendingRequestStatus;
import com.gzzm.lobster.common.PendingRequestType;
import net.cyan.thunwind.annotation.ColumnDescription;
import net.cyan.thunwind.annotation.Entity;
import net.cyan.thunwind.annotation.Index;

import java.util.Date;

/**
 * PendingRequest —— 待处理交互对象 / A pending interaction owned by a thread.
 *
 * <p><b>不是 waiting lifecycle</b>：它是 thread 上的一个待完成事实。
 * 用户响应后变成 thread 的新输入事件，触发下一轮 run。
 * <br>
 * <b>Not a waiting lifecycle</b>: it is a "to-do" on the thread.
 * The user's response becomes a new input event that triggers the next run.
 */
@Entity(table = "AI_PENDING_REQUEST", keys = "requestId")
public class PendingRequest {

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

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

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

    private PendingRequestType type;

    @ColumnDescription(type = "varchar(200)")
    private String title;

    @ColumnDescription(type = "varchar(2000)")
    private String prompt;

    /** 任意 payload JSON / Arbitrary payload JSON. */
    @ColumnDescription(type = "blob")
    private String payloadJson;

    /** 可选动作列表 JSON：["CONFIRM","CANCEL","MODIFY"] */
    @ColumnDescription(type = "varchar(300)")
    private String allowedActionsJson;

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

    /** 触发它的 run id（可空）/ Run that produced it. */
    @ColumnDescription(type = "varchar(40)")
    private String sourceRunId;

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

    private PendingRequestStatus status;

    /** 用户响应内容 / User response payload. */
    @ColumnDescription(type = "blob")
    private String responsePayloadJson;

    private Date createTime;
    private Date resolvedAt;
    private Date expiredAt;

    public PendingRequest() {}

    public String getRequestId() { return requestId; }
    public void setRequestId(String requestId) { this.requestId = requestId; }
    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 PendingRequestType getType() { return type; }
    public void setType(PendingRequestType type) { this.type = type; }
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }
    public String getPrompt() { return prompt; }
    public void setPrompt(String prompt) { this.prompt = prompt; }
    public String getPayloadJson() { return payloadJson; }
    public void setPayloadJson(String payloadJson) { this.payloadJson = payloadJson; }
    public String getAllowedActionsJson() { return allowedActionsJson; }
    public void setAllowedActionsJson(String allowedActionsJson) { this.allowedActionsJson = allowedActionsJson; }
    public String getRelatedArtifactId() { return relatedArtifactId; }
    public void setRelatedArtifactId(String relatedArtifactId) { this.relatedArtifactId = relatedArtifactId; }
    public String getSourceRunId() { return sourceRunId; }
    public void setSourceRunId(String sourceRunId) { this.sourceRunId = sourceRunId; }
    public String getToolCallId() { return toolCallId; }
    public void setToolCallId(String toolCallId) { this.toolCallId = toolCallId; }
    public PendingRequestStatus getStatus() { return status; }
    public void setStatus(PendingRequestStatus status) { this.status = status; }
    public String getResponsePayloadJson() { return responsePayloadJson; }
    public void setResponsePayloadJson(String responsePayloadJson) { this.responsePayloadJson = responsePayloadJson; }
    public Date getCreateTime() { return createTime; }
    public void setCreateTime(Date createTime) { this.createTime = createTime; }
    public Date getResolvedAt() { return resolvedAt; }
    public void setResolvedAt(Date resolvedAt) { this.resolvedAt = resolvedAt; }
    public Date getExpiredAt() { return expiredAt; }
    public void setExpiredAt(Date expiredAt) { this.expiredAt = expiredAt; }
}
