package com.njcn.rdms.module.project.dal.mysql.project.task;

import com.njcn.rdms.framework.mybatis.core.mapper.BaseMapperX;
import com.njcn.rdms.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.njcn.rdms.module.project.dal.dataobject.project.task.TaskAssigneeDO;
import org.apache.ibatis.annotations.Mapper;

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

@Mapper
public interface TaskAssigneeMapper extends BaseMapperX<TaskAssigneeDO> {

    /**
     * 查同一任务下指定 userId 当前活跃的协办段（removed_at IS NULL）。失效段不会命中。
     */
    default TaskAssigneeDO selectActiveByTaskIdAndUserId(Long taskId, Long userId) {
        return selectOne(new LambdaQueryWrapperX<TaskAssigneeDO>()
                .eq(TaskAssigneeDO::getTaskId, taskId)
                .eq(TaskAssigneeDO::getUserId, userId)
                .isNull(TaskAssigneeDO::getRemovedAt));
    }

    /**
     * 查指定任务下所有当前活跃协办，按加入时间正序。
     */
    default List<TaskAssigneeDO> selectActiveListByTaskId(Long taskId) {
        return selectList(new LambdaQueryWrapperX<TaskAssigneeDO>()
                .eq(TaskAssigneeDO::getTaskId, taskId)
                .isNull(TaskAssigneeDO::getRemovedAt)
                .orderByAsc(TaskAssigneeDO::getJoinedAt)
                .orderByAsc(TaskAssigneeDO::getId));
    }

    /**
     * 批量查多个任务的活跃协办（分页装配 N+1 优化）。
     */
    default List<TaskAssigneeDO> selectActiveListByTaskIds(Collection<Long> taskIds) {
        if (taskIds == null || taskIds.isEmpty()) {
            return Collections.emptyList();
        }
        return selectList(new LambdaQueryWrapperX<TaskAssigneeDO>()
                .in(TaskAssigneeDO::getTaskId, taskIds)
                .isNull(TaskAssigneeDO::getRemovedAt)
                .orderByAsc(TaskAssigneeDO::getTaskId)
                .orderByAsc(TaskAssigneeDO::getJoinedAt)
                .orderByAsc(TaskAssigneeDO::getId));
    }

    /**
     * 按主键 + 任务 ID 双键查；返回的记录可能已失效（removed_at != null），由调用方判断。
     */
    default TaskAssigneeDO selectByIdAndTaskId(Long id, Long taskId) {
        return selectOne(new LambdaQueryWrapperX<TaskAssigneeDO>()
                .eq(TaskAssigneeDO::getId, id)
                .eq(TaskAssigneeDO::getTaskId, taskId));
    }

    /**
     * 按 task_id 集合批量软删任务协办（含已 removed 的历史段，统一标 deleted=1）。
     * 协办人不参与"是否有下挂数据"判定，但级联删任务时仍要一并清理。
     */
    default int deleteByTaskIdIn(Collection<Long> taskIds) {
        if (taskIds == null || taskIds.isEmpty()) {
            return 0;
        }
        return delete(new LambdaQueryWrapperX<TaskAssigneeDO>()
                .in(TaskAssigneeDO::getTaskId, taskIds));
    }

}
