package cn.iocoder.yudao.module.system.job;

import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper;
import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;/*
 * @author: ziin
 * @date: 2025/12/11 20:55
 */
@Slf4j
@Component
public class DisableWebAIExpiredAccount implements JobHandler{

    /**
 * 租户数据访问对象
 * 用于查询租户信息和过期时间
 */
    @Resource
    TenantMapper tenantMapper;

    /**
     * 管理员用户数据访问对象
     * 用于查询和更新用户权限状态
     */
    @Resource
    private AdminUserMapper userMapper;


    @Override
    @TenantJob
    public String execute(String param) throws Exception {
        Long tenantId = TenantContextHolder.getTenantId();
        TenantDO tenant = tenantMapper.selectById(tenantId);

        // 检查租户是否配置了AI过期时间
        if (tenant.getAiExpireTime() == null) {
            return "租户未配置AI过期时间";
        }

        // 判断是否已过期（当前时间 >= 过期时间）
        if (LocalDateTime.now().isBefore(tenant.getAiExpireTime())) {
            return "WebAI权限未过期，无需处理";
        }

        // 查询当前租户下所有启用WebAI权限的用户ID
        LambdaQueryWrapper<AdminUserDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(AdminUserDO::getTenantId, tenantId)
                    .eq(AdminUserDO::getWebAi, 1)
                    .select(AdminUserDO::getId);
        List<AdminUserDO> webAiUserList = userMapper.selectList(queryWrapper);

        if (webAiUserList.isEmpty()) {
            return "无需禁用的WebAI账号";
        }

        // 批量更新：禁用WebAI权限
        AdminUserDO updateEntity = new AdminUserDO();
        updateEntity.setWebAi((byte) 0);
        LambdaQueryWrapper<AdminUserDO> updateWrapper = new LambdaQueryWrapper<>();
        updateWrapper.eq(AdminUserDO::getTenantId, tenantId)
                     .eq(AdminUserDO::getWebAi, 1);
        int updatedCount = userMapper.update(updateEntity, updateWrapper);

        // 记录被禁用的账号ID
        webAiUserList.forEach(user -> log.info("禁用过期WebAI账号，账号ID：{}", user.getId()));

        return "禁用过期WebAI账号成功，共禁用 " + updatedCount + " 个账号";
    }
}

