package cn.iocoder.byzs.module.aicourse.job;

import cn.iocoder.byzs.framework.quartz.core.handler.JobHandler;
import cn.iocoder.byzs.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.byzs.module.aicourse.dal.dataobject.aiCourseType.AiCourseTypeDO;
import cn.iocoder.byzs.module.aicourse.service.aiCourseType.AiCourseTypeService;
import cn.iocoder.byzs.module.system.dal.dataobject.permission.RoleDO;
import cn.iocoder.byzs.module.system.service.permission.RoleService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 每天开2节blockly课程 Job
 *
 * @author j-sentinel
 */
@Slf4j
@Component
public class JobAiCourseAotoRoleJob implements JobHandler {

    @Resource
    private AiCourseTypeService blocklyTypeService;

    @Resource
    private RoleService roleService;

    // 定义常量
    private static final Integer autoCount = 2; // 自动分配的课程数量

    @Override
    @TenantIgnore
    public String execute(String roleIdParam) {
        log.info("开始执行自动分配blockly课程权限任务, 角色ID: {}", roleIdParam);
        Long roleId = Long.parseLong(roleIdParam);

        try {
            // 1. 获取指定租户下的角色信息
            RoleDO role = roleService.getRole(roleId);
            if (role == null) {
                log.warn("未找到指定角色, roleId: {}", roleId);
                return "未找到指定角色";
            }

            // 2. 获取角色当前的blockly权限
            Set<Long> existingAiCourseIds = role.getDataScopeAiCourseIds();
            if (existingAiCourseIds == null) {
                existingAiCourseIds = new HashSet<>();
            }

            // 3. 获取所有blockly主题列表（父级ID为0的类型）
            List<AiCourseTypeDO> themes = blocklyTypeService.getAiCourseTypeList(
                    new cn.iocoder.byzs.module.aicourse.controller.admin.aiCourseType.vo.AiCourseTypeListReqVO()
                            .setCtParentId(AiCourseTypeDO.CT_PARENT_ID_ROOT)
            );

            // 按排序字段升序排列主题
            themes.sort(Comparator.comparing(AiCourseTypeDO::getCtTypeSort, Comparator.nullsLast(Comparator.naturalOrder())));

            log.info("获取到 {} 个主题", themes.size());

            // 4. 收集需要新增的课程ID
            Set<Long> newAiCourseIds = new HashSet<>();

            // 5. 遍历主题，查找每个主题下的课程类型和课程
            for (AiCourseTypeDO theme : themes) {
                if (newAiCourseIds.size() >= autoCount) {
                    break; // 已经找到2个未配置的课程，跳出循环
                }

                // 获取当前主题下的所有课程类型
                List<AiCourseTypeDO> courseTypes = blocklyTypeService.getAiCourseTypeList(
                        new cn.iocoder.byzs.module.aicourse.controller.admin.aiCourseType.vo.AiCourseTypeListReqVO()
                                .setCtParentId(theme.getId())
                );

                // 按排序字段升序排列课程类型
                courseTypes.sort(Comparator.comparing(AiCourseTypeDO::getCtTypeSort, Comparator.nullsLast(Comparator.naturalOrder())));

                log.info("主题 {} 下有 {} 个课程类型", theme.getCtType(), courseTypes.size());

                // 遍历课程类型，获取课程
                for (AiCourseTypeDO courseType : courseTypes) {
                    if (newAiCourseIds.size() >= autoCount) {
                        break; // 已经找到2个未配置的课程，跳出循环
                    }

                    // 检查该课程是否已经配置了权限
                    if (!existingAiCourseIds.contains(courseType.getId())) {
                        newAiCourseIds.add(courseType.getId());
                        log.info("找到未配置权限的课程: ID={}, 名称={}", courseType.getId(), courseType.getCtType());
                    }
                }
            }

            // 6. 如果找到了新的课程ID，更新角色权限
            if (!newAiCourseIds.isEmpty()) {
                // 合并现有的权限和新权限
                Set<Long> updatedAiCourseIds = new HashSet<>(existingAiCourseIds);
                updatedAiCourseIds.addAll(newAiCourseIds);

                // 更新角色的ai课程权限
                roleService.updateRoleAiCourseScope(roleId, updatedAiCourseIds);
                log.info("成功为角色 {} 添加了 {} 个新的blockly课程权限: {}", roleId, updatedAiCourseIds.size(), updatedAiCourseIds);
                return String.format("成功添加了 %d 个新的blockly课程权限", updatedAiCourseIds.size());
            } else {
                log.info("未找到需要新增的blockly课程权限");
                return "未找到需要新增的blockly课程权限";
            }
        } catch (Exception e) {
            log.error("执行自动分配blockly课程权限任务时发生错误", e);
            return "执行任务时发生错误: " + e.getMessage();
        }
    }
}