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

import cn.hutool.core.date.LocalDateTimeUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
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.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;

/**
 * 禁用过期账号定时任务处理器
 * <p>
 * 该类用于定时检查并禁用已过期的AI账号和大哥账号。
 * 通过查询租户表中已过期的账号，然后将对应用户的权限状态更新为禁用。
 * </p>
 *
 * @author ziin
 * @date 2025/9/16 14:35
 */
@Slf4j
@Component
public class DisableBrotherExpiredAccount implements JobHandler {

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

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

    /**
     * 执行禁用过期账号的定时任务
     * <p>
     * 该方法会执行以下操作：
     * 1. 查询所有AI账号已过期的租户
     * 2. 查询所有大哥账号已过期的租户
     * 3. 分别禁用这些租户下的用户对应权限
     * 4. 返回操作结果统计信息
     * </p>
     *
     * @param param 任务参数（当前未使用）
     * @return 操作结果字符串，包含禁用的AI账号和大哥账号数量
     * @throws Exception 执行过程中可能抛出的异常
     */
    @Override
    @TenantJob
    /**
     * 执行禁用过期大哥账号的定时任务
     * @param param 任务参数（未使用）
     * @return 执行结果信息
     * @throws Exception 执行过程中可能抛出的异常
     */
    public String execute(String param) throws Exception {
        // 获取当前租户ID
        Long tenantId = TenantContextHolder.getTenantId();
        // 查询当前租户信息
        TenantDO tenant = tenantMapper.selectById(tenantId);

        // 检查租户是否配置了大哥账号过期时间，如未配置则直接返回提示
        if (tenant.getBrotherExpireTime() == null) {
            return "租户未配置大哥过期时间";
        }

        // 计算从租户设置的过期时间到当前时间的时间差
        Duration brotherDuration = LocalDateTimeUtil.between(tenant.getBrotherExpireTime(), LocalDateTime.now());
        // 转换为分钟数
        long minutes = brotherDuration.toMinutes();

        // 创建查询条件，查找当前租户下的所有大哥账号
        LambdaQueryWrapper<AdminUserDO> brotherUserQueryWrapper = new LambdaQueryWrapper<>();
        brotherUserQueryWrapper.eq(AdminUserDO::getTenantId, tenantId);
        brotherUserQueryWrapper.eq(AdminUserDO::getBigBrother, 1);

        // 查询符合条件的大哥账号列表
        List<AdminUserDO> aiUserList = userMapper.selectList(brotherUserQueryWrapper);

        // 统计被禁用的大哥账号数量
        int brotherAccountNum = 0;

        // 如果已过过期时间（minutes >= 0表示当前时间已超过过期时间）
        if (minutes >= 0) {
            // 遍历所有大哥账号进行禁用操作
            for (AdminUserDO adminUserDO : aiUserList) {
                // 将BigBrother标志设置为0，表示禁用大哥权限
                adminUserDO.setBigBrother((byte) 0);
                // 更新用户信息到数据库
                userMapper.updateById(adminUserDO);
                // 更新统计计数
                brotherAccountNum++;
                // 记录禁用操作日志
                log.info("禁用过期大哥账号，账号ID：{}", adminUserDO.getId());
            }
        }
        // 返回操作结果：包含禁用的大哥账号数量统计
        return "禁用过期账号成功，禁用了 " + brotherAccountNum + " 个 大哥账号。";
    }


}