package cn.axzo.workflow.core.service;

import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocCloneDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocOrderDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocUpdateDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.model.doc.DocBaseVO;
import cn.axzo.workflow.core.repository.entity.ExtAxModelDoc;

import java.util.List;

/**
 * 模型关联文档
 *
 * @author wangli
 * @since 2025-03-28 18:12
 */
public interface ExtAxModelDocService {

    /**
     * 模型文档分页搜索
     *
     * @param dto
     * @return
     */
    BpmPageResult<DocBaseVO> docPage(DocSearchDTO dto);

    List<DocBaseVO> docList(DocQueryDTO dto);

    List<ExtAxModelDoc> querySetting(String key, String tenantId);

    /**
     * 获取指定文档
     *
     * @param docId
     * @return
     */
    DocBaseVO get(Long docId);

    /**
     * 获取指定文档忽略删除
     *
     * @param docId
     * @return
     */
    DocBaseVO get(Long docId, boolean ignoreDelete);

    /**
     * 模型文档创建
     *
     * @param dto
     * @return
     */
    Long createDoc(DocCreateDTO dto, Boolean fireEvent);

    /**
     * 模型文档更新
     *
     * @param dto
     * @return
     */
    Boolean updateDoc(DocUpdateDTO dto);

    /**
     * 克隆文档
     *
     * @param dto
     * @return
     */
    Long cloneDoc(DocCloneDTO dto);

    /**
     * 特殊场景的克隆，一般情况下请调用上面的接口。
     * <p>
     * 该接口内部，会在 ext_ax_model_doc 中生成一条新的记录，但其 temp_file 标识是 true
     *
     * @param dto
     * @param tempFile
     * @return
     */
    Long cloneDoc(DocCloneDTO dto, Boolean tempFile);

    /**
     * 模型文档删除
     *
     * @param docId
     * @return
     */
    Boolean deleteDoc(Long docId);

    /**
     * 批量删除
     *
     * @param docIds 文档列表
     * @return 是否成功
     */
    Boolean batchDeleteDoc(List<Long> docIds);

    /**
     * 模型文档排序
     *
     * @param dto
     * @return
     */
    Boolean orderDoc(DocOrderDTO dto);

    /**
     * 修改文档状态
     *
     * @param dto
     * @return
     */
    Boolean statusDoc(DocStatusDTO dto);

    /**
     * 修改文档必选
     *
     * @param dto
     * @return
     */
    Boolean requireDoc(DocStatusDTO dto);

    List<DocBaseVO> getIds(List<Long> ids);
}
