package org.dromara.system.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.BusUserProjectRelevancy;
import org.dromara.system.domain.dto.project.BusProjectBatchByProjectListReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyCreateReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyQueryReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyUpdateReq;
import org.dromara.system.domain.vo.userprojectrelevancy.BusLoginUserProjectRelevancyVo;
import org.dromara.system.domain.vo.userprojectrelevancy.BusUserProjectRelevancyVo;

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

/**
 * 系统用户与项目关联Service接口
 *
 * @author lilemy
 * @date 2025-03-04
 */
public interface IBusUserProjectRelevancyService extends IService<BusUserProjectRelevancy> {

    /**
     * 查询系统用户与项目关联
     *
     * @param id 主键
     * @return 系统用户与项目关联
     */
    BusUserProjectRelevancyVo queryById(Long id);

    /**
     * 分页查询系统用户与项目关联列表
     *
     * @param req       查询条件
     * @param pageQuery 分页参数
     * @return 系统用户与项目关联分页列表
     */
    TableDataInfo<BusUserProjectRelevancyVo> queryPageList(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery);

    /**
     * 查询符合条件的系统用户与项目关联列表
     *
     * @param req 查询条件
     * @return 系统用户与项目关联列表
     */
    List<BusUserProjectRelevancyVo> queryList(BusUserProjectRelevancyQueryReq req);

    /**
     * 新增系统用户与项目关联
     *
     * @param req 系统用户与项目关联
     * @return 新增关联id
     */
    Long insertByBo(BusUserProjectRelevancyCreateReq req);

    /**
     * 批量新增用户和项目关联
     *
     * @param projectId  项目ID
     * @param userIdList 用户ID列表
     * @param userType   用户类型
     */
    void saveBatchByUserList(Long projectId, List<Long> userIdList, String userType);

    /**
     * 批量新增用户和项目关联
     *
     * @param projectIdList 项目ID列表
     * @param userId        用户ID
     * @param userType      用户类型
     */
    void saveBatchByProjectList(List<Long> projectIdList, Long userId, String userType);

    /**
     * 修改系统用户与项目关联
     *
     * @param req 系统用户与项目关联
     * @return 是否修改成功
     */
    Boolean updateByBo(BusUserProjectRelevancyUpdateReq req);

    /**
     * 校验并批量删除系统用户与项目关联信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 根据用户ID删除系统用户与项目关联
     *
     * @param userId 用户ID
     */
    void deleteByUserId(Long userId);

    /**
     * 根据项目ID和用户ID列表删除系统用户与项目关联
     *
     * @param oldProjectId 项目ID
     * @param userIds      用户ID列表
     */
    void deleteByProjectAndUserIds(Long oldProjectId, List<Long> userIds);

    /**
     * 获取当前登录用户项目列表
     *
     * @param userId 登录用户ID
     * @return 当前登录用户项目列表
     */
    List<BusLoginUserProjectRelevancyVo> queryListByUserId(Long userId);

    /**
     * 获取当前登录用户项目分页
     *
     * @param userId    登录用户ID
     * @param req       分页查询条件
     * @param pageQuery 分页参数
     * @return 当前登录用户项目分页
     */
    TableDataInfo<BusUserProjectRelevancyVo> queryPageByUserId(Long userId, BusUserProjectRelevancyQueryReq req, PageQuery pageQuery);

    /**
     * 批量新增用户和项目关联
     *
     * @param req 新增参数
     * @return 是否增加成功
     */
    Boolean insertBatchByProjectList(BusProjectBatchByProjectListReq req);

    /**
     * 获取系统用户与项目关联视图
     *
     * @param userProjectRelevancy 系统用户与项目关联
     * @return 系统用户与项目关联视图
     */
    BusUserProjectRelevancyVo getVo(BusUserProjectRelevancy userProjectRelevancy);

    /**
     * 获取用户和项目关联对象查询条件封装
     *
     * @param req 查询条件
     * @return 查询条件封装
     */
    LambdaQueryWrapper<BusUserProjectRelevancy> buildQueryWrapper(BusUserProjectRelevancyQueryReq req);

    /**
     * 获取系统用户与项目关联分页视图
     *
     * @param userProjectRelevancyPage 系统用户与项目关联分页
     * @return 系统用户与项目关联分页视图
     */
    Page<BusUserProjectRelevancyVo> getVoPage(Page<BusUserProjectRelevancy> userProjectRelevancyPage);

}
