package com.gzzm.lobster.workspace;

import com.gzzm.lobster.common.ResourceSourceType;
import com.gzzm.lobster.common.WorkspaceResourceStatus;
import net.cyan.thunwind.annotation.OQL;
import net.cyan.thunwind.annotation.OQLUpdate;
import net.cyan.thunwind.dao.GeneralDao;

import java.util.List;

/**
 * WorkspaceResourceDao —— Workspace 资源持久化 / Workspace resource persistence.
 *
 * <p>status/sourceType 枚举字段在 thunwind 默认映射下以 ordinal 形式存到 smallint 列，
 * OQL 里用字符串字面量（如 'ACTIVE'）翻译到 JDBC 时与 ordinal 列不匹配，查不到数据；
 * 因此统一用参数化绑定，由 thunwind 把枚举参数转成 ordinal 再传给 JDBC。
 */
public abstract class WorkspaceResourceDao extends GeneralDao {

    @OQL("select r from WorkspaceResource r where r.resourceId=:1")
    public abstract WorkspaceResource getResource(String resourceId) throws Exception;

    @OQL("select r from WorkspaceResource r where r.threadId=:1 and r.status=?2 order by r.updateTime desc limit :3,:4")
    public abstract List<WorkspaceResource> listByThread(String threadId, WorkspaceResourceStatus status, int offset, int limit) throws Exception;

    @OQL("select r from WorkspaceResource r where r.threadId=:1 and r.sourceType=?2 and r.status=?3 order by r.updateTime desc limit :4,:5")
    public abstract List<WorkspaceResource> listByThreadAndType(String threadId, ResourceSourceType type, WorkspaceResourceStatus status, int offset, int limit) throws Exception;

    @OQL("select count(r.resourceId) from WorkspaceResource r where r.threadId=:1 and r.status=?2")
    public abstract Long countByThread(String threadId, WorkspaceResourceStatus status) throws Exception;

    @OQL("select r from WorkspaceResource r where r.threadId=:1 and r.displayName like ?2 and r.status=?3 limit 0,:4")
    public abstract List<WorkspaceResource> searchByTitle(String threadId, String pattern, WorkspaceResourceStatus status, int limit) throws Exception;

    @OQL("select r from WorkspaceResource r where r.threadId=:1 and r.sourceType=?2 and r.sourceId=:3 and r.status=?4 limit 0,1")
    public abstract List<WorkspaceResource> findByThreadAndSource(String threadId, ResourceSourceType type,
                                                                  String sourceId, WorkspaceResourceStatus status) throws Exception;

    @OQLUpdate("update WorkspaceResource set status=?1 where resourceId=?2")
    public abstract int archive(WorkspaceResourceStatus status, String resourceId) throws Exception;
}
