package com.xmomen.module.product.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.xmomen.framework.mybatis.dao.MybatisDao;
import com.xmomen.module.product.entity.Category;
import com.xmomen.module.product.mapper.ProductCategoryMapper;
import com.xmomen.module.product.model.CategoryModel;
import com.xmomen.module.product.service.CategoryService;

/**
 * CategoryServiceImpl 类是 CategoryService 接口的实现类，负责处理产品类别的业务逻辑。
 * 它使用 MyBatis 进行数据库操作，将数据库中的 Category 实体转换为 CategoryModel 并构建成树形结构。
 * @author xiao
 */
@Service
public class CategoryServiceImpl implements CategoryService {

	// 注入 MyBatis 数据访问对象，用于执行数据库操作
	@Autowired
	MybatisDao mybatisDao;

	/**
	 * 获取所有产品类别的列表，并将其转换为树形结构的 CategoryModel 列表。
	 * @return 包含所有产品类别的树形结构的 CategoryModel 列表
	 */
	public List<CategoryModel> getAllProductCategory() {
		// 调用 MyBatis 的 SQLSessionTemplate 执行查询，获取所有产品类别的 Category 实体列表
		List<Category> categoryList = mybatisDao.getSqlSessionTemplate().selectList(ProductCategoryMapper.ProductCategoryMapperNameSpace + "getProductCategoryList");
		// 用于存储最终的 CategoryModel 列表
		List<CategoryModel> categories = new ArrayList<CategoryModel>();
		// 如果查询结果不为空
		if(categoryList != null) {
			// 使用 TreeMap 存储顶级类别，TreeMap 会根据键的自然顺序排序
			Map<String, CategoryModel> topCategories = new TreeMap<String, CategoryModel>();
			// 遍历 Category 实体列表
			for(Category category: categoryList) {
				// 创建一个新的 CategoryModel 对象
				CategoryModel model = new CategoryModel();
				// 设置 CategoryModel 的 ID
				model.setId(category.getId());
				// 初始假设该类别为叶子节点（没有子节点）
				model.setLeaf(true);
				// 设置 CategoryModel 的名称
				model.setName(category.getName());
				// 如果该类别没有父类别（即顶级类别）
				if(category.getParentId() == null) {
					// 将该顶级类别添加到 topCategories 映射中
					topCategories.put(String.valueOf(category.getId()), model);
				} else {
					// 根据父类别 ID 从 topCategories 映射中获取父类别
					CategoryModel parentCategory = topCategories.get(String.valueOf(category.getParentId()));
					// 如果找到了父类别
					if(parentCategory != null) {
						// 说明该父类别有子节点，不是叶子节点
						parentCategory.setLeaf(false);
						// 设置当前类别模型的父类别 ID
						model.setParentId(parentCategory.getId());
						// 设置当前类别模型的父类别名称
						model.setParentName(parentCategory.getName());
						// 如果父类别还没有子节点列表
						if(parentCategory.getNodes() == null) {
							// 为父类别创建一个新的子节点列表
							parentCategory.setNodes(new ArrayList<CategoryModel>());
						}
						// 将当前类别模型添加到父类别的子节点列表中
						parentCategory.getNodes().add(model);
					}
				}
			}
			// 将 topCategories 映射中的所有值（即顶级类别）添加到最终的 categories 列表中
			categories.addAll(topCategories.values());
		}
		// 返回最终的 CategoryModel 列表
		return categories;
	}
}