package com.education.api.config.util;
import com.alibaba.fastjson.JSON;
import com.education.model.entity.ExtKnowledgePoint;

import java.util.*;

public class KnowledgePointConverter {

    // 内部类：定义JSON中的节点结构
    static class Node {
        private String id;         // 对应ExtKnowledgePoint的id
        private String name;       // 对应ExtKnowledgePoint的pointName
        private double symbolSize; // 保持默认值
        private double x;          // 保持默认值
        private double y;          // 保持默认值
        private double value;      // 保持默认值
        private int category;      // 对应categories的索引

        public Node(String id, String name ,int category) {
            this.id = id;
            this.name = name;
            this.symbolSize = 10.0;  // 默认值
            this.x = 0.0;            // 默认值
            this.y = 0.0;            // 默认值
            this.value = 5.0;        // 默认值
            this.category = 0;       // 默认归类到第一个分类（可自定义）
        }

        // getter和setter（FastJSON序列化需要）
        public String getId() { return id; }
        public void setId(String id) { this.id = id; }
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public double getSymbolSize() { return symbolSize; }
        public void setSymbolSize(double symbolSize) { this.symbolSize = symbolSize; }
        public double getX() { return x; }
        public void setX(double x) { this.x = x; }
        public double getY() { return y; }
        public void setY(double y) { this.y = y; }
        public double getValue() { return value; }
        public void setValue(double value) { this.value = value; }
        public int getCategory() { return category; }
        public void setCategory(int category) { this.category = category; }
    }

    // 内部类：定义JSON中的链接结构
    static class Link {
        private String source;  // 对应ExtKnowledgePoint的parentId
        private String target;  // 对应ExtKnowledgePoint的id

        public Link(String source, String target) {
            this.source = source;
            this.target = target;
        }

        // getter和setter
        public String getSource() { return source; }
        public void setSource(String source) { this.source = source; }
        public String getTarget() { return target; }
        public void setTarget(String target) { this.target = target; }
    }

    // 新增：定义分类结构（categories）
    static class Category {
        private String name; // 分类名称

        public Category(String name) {
            this.name = name;
        }

        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    }

    /**
     * 将List<ExtKnowledgePoint>转换为包含categories的目标JSON结构
     * @param knowledgePoints 知识点列表
     * @return 转换后的JSON字符串
     */
    public static String convert(List<ExtKnowledgePoint> knowledgePoints) {
        // 1. 构建节点列表（nodes）
        List<Node> nodes = new ArrayList<>();
        for (ExtKnowledgePoint point : knowledgePoints) {
            Node node = new Node(
                    point.getId().toString(),
                    point.getPointName(),
                    point.getLevel()
            );
            // 可选：根据level设置category（与categories索引对应）
            if (point.getLevel() != null) {
                // 例如：level=1 → 分类0（A），level=2 → 分类1（B）
                node.setCategory(point.getLevel() - 1);
            }
            nodes.add(node);
        }

        // 2. 构建链接列表（links）
        List<Link> links = new ArrayList<>();
        for (ExtKnowledgePoint point : knowledgePoints) {
            Integer parentId = point.getParentId();
            if (parentId != null) {
                Link link = new Link(
                        parentId.toString(),
                        point.getId().toString()
                );
                links.add(link);
            }
        }

        // 3. 新增：构建分类列表（categories）
        int max = getMaxLevel(knowledgePoints);
       List<Category> categories = new ArrayList<>();
       for (int i = 0 ; i <= max ; i++) {
           categories.add(new Category(i+ ""));  // 第一个分类
           //categories.add(new Category("B"));  // 第二个分类
       }


        // 4. 组装为最终JSON结构（包含nodes、links、categories）
        Map<String, Object> result = new HashMap<>();
        result.put("nodes", nodes);
        result.put("links", links);
        result.put("categories", categories);  // 新增categories节点

        // 5. 转换为JSON字符串并返回
        return JSON.toJSONString(result, true);
    }

    /**
     * 获取知识点列表中level字段的最大值
     * @param knowledgePoints 知识点列表
     * @return level的最大值，如果列表为空或所有level为null则返回0
     */
    public static int getMaxLevel(List<ExtKnowledgePoint> knowledgePoints) {
        if (knowledgePoints == null || knowledgePoints.isEmpty()) {
            return 0;
        }

        // 使用Java 8 Stream过滤掉null值并获取最大值
        Optional<Integer> maxLevel = knowledgePoints.stream()
                .map(ExtKnowledgePoint::getLevel)
                .filter(level -> level != null)
                .max(Integer::compareTo);

        return maxLevel.orElse(0);
    }
}