package cn.iocoder.byzs.module.web.controller.admin.aiCourse;

import cn.iocoder.byzs.framework.common.pojo.CommonResult;
import cn.iocoder.byzs.framework.common.util.object.BeanUtils;
import cn.iocoder.byzs.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.byzs.module.aicourse.controller.admin.aiCourseType.vo.AiCourseTypeListReqVO;
import cn.iocoder.byzs.module.aicourse.controller.admin.aiCourseType.vo.AiCourseTypeRespVO;
import cn.iocoder.byzs.module.aicourse.dal.dataobject.aiCourseType.AiCourseTypeDO;
import cn.iocoder.byzs.module.aicourse.service.aiCourse.AiCourseService;
import cn.iocoder.byzs.module.aicourse.service.aiCourseType.AiCourseTypeService;
import cn.iocoder.byzs.module.web.controller.admin.aiCourse.vo.WebAiCourseTypeVO;
import cn.iocoder.byzs.module.web.controller.admin.aiCourse.vo.WebAiCourseVO;
import cn.iocoder.byzs.module.web.service.aiCourse.WebAiCourseServiceImpl;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import lombok.Data;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.beans.Transient;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static cn.iocoder.byzs.framework.common.pojo.CommonResult.success;

@Tag(name = "Web-前端接口")
@RestController
@RequestMapping("/bjdxWeb/aiCourse")
@Validated
public class WebAICourseController {

    @Resource
    private AiCourseService aiCourseService;
    @Resource
    private WebAiCourseServiceImpl webAiCourseService;
    @Resource
    private AiCourseTypeService aiCourseTypeService;

    @GetMapping("/getTypeTheme")
    @Operation(summary = "获得aiCourse主题")
    @TenantIgnore
    @PermitAll
    public CommonResult<List<AiCourseTypeRespVO>> getTypeTheme() {
        AiCourseTypeListReqVO listReqVO = new AiCourseTypeListReqVO().setCtTypeNode("0");
        List<AiCourseTypeDO> list = aiCourseTypeService.getAiCourseTypeList(listReqVO);
        List<AiCourseTypeRespVO> listVo = BeanUtils.toBean(list, AiCourseTypeRespVO.class);
        return success(listVo);
    }

    @GetMapping("/getTypeByThemeId")
    @Operation(summary = "获得aiCourse课程类型-根据主题id")
    @TenantIgnore
    @PermitAll
    public CommonResult<List<WebAiCourseTypeVO>> getTypeByThemeId(@RequestParam("id") Long themeId) {
        List<WebAiCourseTypeVO> list = webAiCourseService.getTypeByThemeId(themeId);
        return success(list);
    }

    @GetMapping("/getAiCourseByTypeId")
    @Operation(summary = "获得aiCourse课程-根据课程类型id")
    @TenantIgnore
    @PermitAll
    public CommonResult<List<WebAiCourseVO>> getAiCourseByTypeId(@RequestParam("typeId") Long typeId) {
        List<WebAiCourseVO> aiCourseVoList = webAiCourseService.getAiCourseVoByTypeId(typeId);
        return success(aiCourseVoList);
    }

    @GetMapping("/getAiCourseTypeTree")
    @Operation(summary = "获取课程类型树结构(配置权限使用)")
    @TenantIgnore
    @PermitAll
    public CommonResult<List<TreeNode>> getAiCourseTypeTree() {
        // 获取所有课程类型
        List<AiCourseTypeDO> allAiCourseTypes = aiCourseTypeService.getAiCourseTypeList(new AiCourseTypeListReqVO());
        // 获取所有课程
//        List<AiCoursePageReqVO> allAiCourses = aiCourseService.getAiCourseList(new AiCoursePageReqVO());
        
        // 构建课程类型ID到课程类型的映射
        Map<Long, AiCourseTypeDO> aiCourseTypeMap = new HashMap<>();
        for (AiCourseTypeDO aiCourseType : allAiCourseTypes) {
            aiCourseTypeMap.put(aiCourseType.getId(), aiCourseType);
        }
        
        // 构建课程类型树节点
        List<TreeNode> treeNodes = new ArrayList<>();
        
        // 处理根节点 (parentId = 0)
        for (AiCourseTypeDO aiCourseType : allAiCourseTypes) {
            if (AiCourseTypeDO.CT_PARENT_ID_ROOT.equals(aiCourseType.getCtParentId())) {
                TreeNode node = new TreeNode();
                node.setId(aiCourseType.getId());
                node.setParentId(aiCourseType.getCtParentId());
                node.setName(aiCourseType.getCtType() + "（主题）");
                node.setType("主题");
                treeNodes.add(node);
            }
        }
        
        // 递归添加子节点
        for (TreeNode node : treeNodes) {
            addChildNodes(node, allAiCourseTypes, aiCourseTypeMap);
        }
        
        return success(treeNodes);
    }
    
    /**
     * 递归添加子节点
     */
    private void addChildNodes(TreeNode parentNode, List<AiCourseTypeDO> allAiCourseTypes, Map<Long, AiCourseTypeDO> aiCourseTypeMap) {
        List<TreeNode> children = new ArrayList<>();
        
        // 添加子课程类型
        for (AiCourseTypeDO aiCourseType : allAiCourseTypes) {
            if (parentNode.getId().equals(aiCourseType.getCtParentId())) {
                TreeNode childNode = new TreeNode();
                childNode.setId(aiCourseType.getId());
                childNode.setParentId(aiCourseType.getCtParentId());
                childNode.setName(aiCourseType.getCtType());
                childNode.setType("aiCourseType");
                children.add(childNode);
                
                // 递归添加子节点的子节点
//                addChildNodes(childNode, allAiCourseTypes, allAiCourses, aiCourseTypeMap);
            }
        }
        
        // 添加关联的课程
//        for (AiCoursePageReqVO aiCourse : allAiCourses) {
//            if (parentNode.getId().equals(aiCourse.getBcType())) {
//                TreeNode childNode = new TreeNode();
//                childNode.setId(aiCourse.getId());
//                childNode.setParentId(aiCourse.getBcType());
//                childNode.setName(aiCourse.getBcName());
//                childNode.setType("aiCourse");
//                children.add(childNode);
//            }
//        }
        
        parentNode.setChildren(children);
    }
    
    /**
     * 树节点类，用于表示课程类型树结构
     */
    @Data
    public static class TreeNode {
        private Long id;
        private Long parentId;
        private String name;
        private String type; // aiCourseType 或 aiCourse
        private List<TreeNode> children = new ArrayList<>();
    }
}