package jnpf.cultivate.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jnpf.entity.cultivate.CultivateIdentifyApply;
import jnpf.model.cultivate.dto.identify.IdentifyApplyListAppDto;
import jnpf.model.cultivate.dto.identify.IdentifyApplyListDto;
import jnpf.model.cultivate.dto.learn.BatchCommonCountDto;
import jnpf.model.cultivate.v2.apply.req.V2IdentifyApplyListAppReq;
import jnpf.model.cultivate.v2.apply.req.V2IdentifyApplyListReq;
import jnpf.model.cultivate.v2.apply.req.V2MyIdentifyApplyListAppReq;
import jnpf.model.cultivate.v2.apply.vo.V2IdentifyApplyListAppVo;
import jnpf.model.cultivate.v2.apply.vo.V2IdentifyApplyListVo;
import jnpf.model.cultivate.vo.identify.IdentifyApplyListAppDbVo;
import jnpf.model.cultivate.vo.identify.IdentifyApplyListDbVo;
import jnpf.model.cultivate.vo.identify.IdentifyApplyStatisticsApiVo;
import jnpf.model.cultivate.vo.identify.UserIdentifyPageVo;
import jnpf.model.cultivate.vo.learn.FtbCultivateLearnTaskIdentificationInfoVO;
import jnpf.model.cultivate.v2.course.vo.UserLearningStatusVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.List;

/**
 * 实操鉴定申请表
 *
 * @author shitou
 * @email shitou@niujiekeji.com
 * @date 2023-12-19 11:10:53
 */
@Mapper
@Component
public interface CultivateIdentifyApplyMapper extends BaseMapper<CultivateIdentifyApply> {
    /**
     * 实操鉴定申请/列表
     *
     * @param req
     * @return
     */
    List<IdentifyApplyListDbVo> getPageList(@Param("req") IdentifyApplyListDto req);

    /**
     * 实操鉴定申请/列表
     *
     * @param ids
     * @return
     */
    List<IdentifyApplyListDbVo> getList(@Param("ids") List<String> ids);

    /**
     * 成员培训进展/分页列表
     *
     * @return
     */
    Page<UserIdentifyPageVo> getUserIdentifyPage(@Param("page") Page<UserIdentifyPageVo> page, @Param("userId") String userId);

    /**
     * 实操鉴定申请/app列表
     *
     * @param req
     * @param userId
     * @return
     */
    List<IdentifyApplyListAppDbVo> getPageAppList(@Param("req") IdentifyApplyListAppDto req, @Param("userId") String userId, @Param("powerUserIds") List<String> powerUserIds);

    Integer getPageAppListCount(@Param("req") IdentifyApplyListAppDto req, @Param("userId") String userId);

    /**
     * 查询鉴定表有多少人使用
     *
     * @param tableId
     * @return
     */
    Integer getTableUseNumber(@Param("tableId") String tableId);

    /**
     * 成员培训进展/用户鉴定数据统计
     *
     * @param userIds
     * @return
     */
    List<IdentifyApplyStatisticsApiVo> getUserIdentifyStatistics(@Param("userIds") List<String> userIds);

    /**
     * 查询申请中的用户ID
     * 该方法用于根据任务ID和用户ID查询申请中的用户ID列表
     *
     * @param id     任务ID，用于定位特定的任务
     * @param userId 用户ID，用于过滤特定用户的任务
     * @return 申请中的用户ID列表，返回包含申请中用户ID的字符串
     */
    String querAppplyUserIds(@Param("id") String id, @Param("userId") String userId);

    /**
     * 查询识别申请信息
     * 该方法用于根据任务ID和用户ID查询识别申请的详细信息
     *
     * @param taskId 任务ID，用于定位特定的识别任务
     * @param userId 用户ID，用于过滤特定用户的申请信息
     * @return 识别申请信息列表，返回包含识别申请详细信息的列表
     */
    List<FtbCultivateLearnTaskIdentificationInfoVO> queryIdentifyApplyInfo(@Param("taskId") String taskId, @Param("userId") String userId);

    /**
     * 统计每个鉴定的鉴定人数
     *
     * @param taskIds
     * @param type    0-查询所有  1-查询已合格的
     * @return
     */
    List<BatchCommonCountDto> groupIdentifyCountNum(@Param("taskIds") List<String> taskIds, @Param("type") Integer type);

    Page<V2IdentifyApplyListVo> getPageListV2(@Param("page") Page<V2IdentifyApplyListVo> page, @Param("req") V2IdentifyApplyListReq req);

    Page<V2IdentifyApplyListAppVo> queryMyIdentifyApplyList(@Param("page") Page<V2IdentifyApplyListAppVo> page,
                                                            @Param("req") V2MyIdentifyApplyListAppReq req,
                                                            @Param("userId") String userId);

    Page<V2IdentifyApplyListAppVo> queryAppIdentifyApplyList(@Param("page") Page<V2IdentifyApplyListAppVo> page,
                                                             @Param("req") V2IdentifyApplyListAppReq req,
                                                             @Param("orgUserIds") List<String> orgUserIds,
                                                             @Param("powerUserIds") List<String> powerUserIds,
                                                             @Param("myUserIds") List<String> myUserIds,
                                                             @Param("loginUserId") String loginUserId
    );

    Page<V2IdentifyApplyListAppVo> queryAppIdentifyApplyListWaiting(
            @Param("page") Page<V2IdentifyApplyListAppVo> page,
            @Param("req") V2IdentifyApplyListAppReq req,
            @Param("userIds") List<String> userIds,
            @Param("myUserIds") List<String> myUserIds,
            @Param("loginUserId") String loginUserId
    );

    Page<V2IdentifyApplyListAppVo> queryAppIdentifyApplyListComplete(
            @Param("page") Page<V2IdentifyApplyListAppVo> page,
            @Param("req") V2IdentifyApplyListAppReq req,
            @Param("userIds") List<String> userIds,
            @Param("loginUserId") String loginUserId
    );

    List<CultivateIdentifyApply> queryIdentifyApply(@Param("userId") String userId,
                                                    @Param("identifyIds") List<String> identifyIds,
                                                    @Param("source") Integer source,
                                                    @Param("sourceId") String sourceId);

    List<String> queryMyIdentifyUserList(@Param("loginUserId") String loginUserId);

    /**
     * 查询用户已完成的鉴定列表（关联查询鉴定表信息）
     * @param userId 用户ID
     * @return 已完成鉴定列表
     */
    List<UserLearningStatusVo.IdentityInfo> queryCompletedIdentitiesWithInfo(@Param("userId") String userId);

    /**
     * 统计岗位学习中已完成的鉴定数量（关联查询鉴定表和备份表）
     * @param userId 用户ID
     * @param courseIdentityIds 课程鉴定ID列表（对应备份表的F_TableId）
     * @param source 鉴定来源
     * @param sourceId 鉴定来源ID（岗位ID）
     * @return 已完成的鉴定数量
     */
    Long countCompletedIdentifyByPost(@Param("userId") String userId,
                                      @Param("courseIdentityIds") Collection<String> courseIdentityIds,
                                      @Param("source") Integer source,
                                      @Param("sourceId") String sourceId);
}
