package com.dora.mapper;

import com.dora.entity.Workflow;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 工作流Mapper接口
 */
@Mapper
public interface WorkflowMapper {

    /**
     * 根据ID获取工作流信息
     */
    Workflow selectById(@Param("id") Long id);

    /**
     * 根据ID列表批量获取工作流信息
     */
    List<Workflow> selectByIds(@Param("ids") List<Long> ids);

    /**
     * 根据创建者ID获取工作流列表
     */
    List<Workflow> selectByOwnerId(@Param("ownerId") Long ownerId);

    /**
     * 分页按条件获取用户工作流列表
     */
    List<Workflow> listByOwnerPaged(@Param("ownerId") Long ownerId,
                                    @Param("auditStatus") Integer auditStatus,
                                    @Param("keyword") String keyword,
                                    @Param("offset") int offset,
                                    @Param("limit") int limit);

    /**
     * 统计用户工作流数量
     */
    Long countByOwner(@Param("ownerId") Long ownerId,
                      @Param("auditStatus") Integer auditStatus,
                      @Param("keyword") String keyword);

    /**
     * 获取热门工作流列表
     */
    List<Workflow> selectHotWorkflows(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 根据分类获取工作流列表
     */
    List<Workflow> selectWorkflowsByCategory(@Param("category") String category, 
                                           @Param("offset") int offset, 
                                           @Param("limit") int limit);
    
    /**
     * 根据分类获取工作流总数
     */
    Long countWorkflowsByCategory(@Param("category") String category);
    
    /**
     * 根据分类ID获取工作流列表
     */
    List<Workflow> selectWorkflowsByCategoryId(@Param("categoryId") Long categoryId, 
                                             @Param("offset") int offset, 
                                             @Param("limit") int limit);
    
    /**
     * 根据类目ID获取工作流总数
     */
    Long countWorkflowsByCategoryId(@Param("categoryId") Long categoryId);
    
    /**
     * 获取工作流总数
     */
    Long countAllWorkflows();
    
    /**
     * 获取所有分类及其工作流数量
     */
    List<WorkflowCategoryCount> selectCategoryCounts();

    /**
     * 提交工作流审核：更新名称/描述，并置为待审核
     */
    int submitForAudit(@Param("id") Long id,
                       @Param("ownerId") Long ownerId,
                       @Param("name") String name,
                       @Param("description") String description);

    /**
     * 插入新工作流
     */
    int insert(Workflow workflow);

    /**
     * 更新工作流
     */
    int updateById(Workflow workflow);

    /**
     * 软删除工作流
     */
    int softDelete(@Param("id") Long id, @Param("ownerId") Long ownerId);

    /**
     * 根据名称和所有者查询工作流（用于检查是否已存在）
     */
    Workflow selectByNameAndOwner(@Param("name") String name, @Param("ownerId") Long ownerId);

    /**
     * 搜索工作流
     * @param params 搜索参数，包含keyword、category、freeOnly、offset、limit
     * @return 工作流列表
     */
    List<Workflow> searchWorkflows(@Param("params") Map<String, Object> params);

    /**
     * 统计搜索工作流数量
     * @param params 搜索参数，包含keyword、category、freeOnly
     * @return 工作流数量
     */
    Long countSearchWorkflows(@Param("params") Map<String, Object> params);

    /**
     * 更新工作流点赞数
     * @param workflowId 工作流ID
     * @param likeCount 新的点赞数
     * @return 更新行数
     */
    int updateLikeCount(@Param("workflowId") Long workflowId,
                       @Param("likeCount") Integer likeCount);

    /**
     * 获取所有已通过审核的工作流（用于统计分析）
     * @return 工作流列表
     */
    List<Workflow> selectAll();

    /**
     * 根据VOD视频ID统计关联的工作流数量
     * @param vodVideoId 阿里云VOD视频ID
     * @return 关联的工作流数量
     */
    Integer countByVodVideoId(@Param("vodVideoId") String vodVideoId);
    
    /**
     * 工作流分类统计结果
     */
    class WorkflowCategoryCount {
        private String category;
        private Long count;
        
        public String getCategory() {
            return category;
        }
        
        public void setCategory(String category) {
            this.category = category;
        }
        
        public Long getCount() {
            return count;
        }
        
        public void setCount(Long count) {
            this.count = count;
        }
    }
} 