package cn.iocoder.yudao.module.system.service.user;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.tenant.UserTenantRelatePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.tenant.UserTenantRelateSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.UserTenantRelateDO;
import cn.iocoder.yudao.module.system.dal.mysql.user.UserTenantRelateMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import cn.iocoder.yudao.framework.common.util.object.BeanUtils;


import javax.annotation.Resource;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_TENANT_RELATE_NOT_EXISTS;

/**
 * 用户租户关系 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class UserTenantRelateServiceImpl implements UserTenantRelateService {

    @Resource
    private UserTenantRelateMapper userTenantRelateMapper;

    @Override
    public Long createUserTenantRelate(UserTenantRelateSaveReqVO createReqVO) {
        // 插入
        UserTenantRelateDO userTenantRelate = BeanUtils.toBean(createReqVO, UserTenantRelateDO.class);
        userTenantRelateMapper.insert(userTenantRelate);
        // 返回
        return userTenantRelate.getId();
    }

    @Override
    public void updateUserTenantRelate(UserTenantRelateSaveReqVO updateReqVO) {
        // 校验存在
        validateUserTenantRelateExists(updateReqVO.getId());
        // 更新
        UserTenantRelateDO updateObj = BeanUtils.toBean(updateReqVO, UserTenantRelateDO.class);
        userTenantRelateMapper.updateById(updateObj);
    }

    @Override
    public void deleteUserTenantRelate(Long id) {
        // 校验存在
        validateUserTenantRelateExists(id);
        // 删除
        userTenantRelateMapper.deleteById(id);
    }

    private void validateUserTenantRelateExists(Long id) {
        if (userTenantRelateMapper.selectById(id) == null) {
            throw exception(USER_TENANT_RELATE_NOT_EXISTS);
        }
    }

    @Override
    public UserTenantRelateDO getUserTenantRelate(Long id) {
        return userTenantRelateMapper.selectById(id);
    }

    @Override
    public PageResult<UserTenantRelateDO> getUserTenantRelatePage(UserTenantRelatePageReqVO pageReqVO) {
        return userTenantRelateMapper.selectPage(pageReqVO);
    }

    /**
     * 将该用户所有关系设为失效
     *
     * @param userId 用户ID
     * @return 受影响的行数
     */
    @Override
    @TenantIgnore
    public int deactivateAllForUser(Long userId) {
        // 创建一个LambdaUpdateWrapper实例
        LambdaUpdateWrapper<UserTenantRelateDO> updateWrapper = new LambdaUpdateWrapper<>();
        // 使用Lambda表达式来指定更新条件和要更新的字段
        updateWrapper.eq(UserTenantRelateDO::getUserId, userId)
                .set(UserTenantRelateDO::getActived, false); // 注意：这里使用false，MyBatis-Plus会处理类型转换
        // 调用Mapper的update方法，传入null作为实体对象（因为我们只使用Wrapper来指定更新条件）
        // 和LambdaUpdateWrapper作为更新条件
        return userTenantRelateMapper.update(null, updateWrapper);
    }

    /**
     * 校验该用户是否在该租户中
     *
     * @param userId
     * @param tenantId
     * @return
     */
    @Override
    @TenantIgnore
    public boolean checkUserHasTenant(Long userId, Long tenantId) {
        // 使用LambdaQueryWrapper来构建查询条件
        LambdaQueryWrapper<UserTenantRelateDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserTenantRelateDO::getUserId, userId)
                .eq(UserTenantRelateDO::getTenantId, tenantId);
        // 使用Mapper的selectCount方法查询满足条件的记录数
        Long count = userTenantRelateMapper.selectCount(queryWrapper);
        // 如果记录数大于0，则返回true，表示用户拥有该租户
        return count > 0;
    }


    /**
     * 将这个用户这个租户关系设为生效
     *
     * @param updateReqVO 包含用户ID和可能的其他信息
     * @return 受影响的行数
     */
    @Override
    @TenantIgnore
    public int activateForUser(UserTenantRelateSaveReqVO updateReqVO) {
        // 创建一个LambdaUpdateWrapper实例
        LambdaUpdateWrapper<UserTenantRelateDO> updateWrapper = new LambdaUpdateWrapper<>();
        // 使用Lambda表达式来指定更新条件和要更新的字段
        updateWrapper
                .eq(UserTenantRelateDO::getUserId, updateReqVO.getUserId())
                .eq(UserTenantRelateDO::getTenantId, updateReqVO.getTenantId())
                .set(UserTenantRelateDO::getActived, true);
        // 调用Mapper的update方法，传入null作为实体对象（因为我们只使用Wrapper来指定更新条件）
        // 和LambdaUpdateWrapper作为更新条件
        return userTenantRelateMapper.update(null, updateWrapper);
    }

}