package com.keyware.shandan.bianmu.dto;

import com.keyware.shandan.bianmu.enums.DirectoryType;
import com.keyware.shandan.common.util.StreamUtil;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.util.StringUtils;

import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 目录复制功能接口数据传输对象
 */
@Data
public class DirOperateDTO implements Serializable {

    private static final long serialVersionUID = 6457656734510446800L;

    /**
     * 目标目录id
     */
    @NotNull
    private String targetId;

    /**
     * 复制的项目
     */
    @NotNull
    private List<Item> items;

    public List<Item> getTree() {
        return buildTree(null, items);
    }

    private List<Item> buildTree(String parentId, List<Item> itemList) {
        List<Item> tree = new ArrayList<>();
        if (itemList != null) {
            if (StringUtils.hasText(parentId)) {
                for (Item item : itemList) {
                    if (item.getParentId().equals(parentId)) {
                        item.getChildren().addAll(buildTree(item.getId(), itemList));
                        tree.add(item);
                    }
                }
            } else {
                getRoots().forEach(item -> {
                    item.getChildren().addAll(buildTree(item.getId(), itemList));
                    tree.add(item);
                });
            }
        }

        return tree;
    }

    /**
     * 查找items中的根节点集合
     *
     * @return
     */
    public List<Item> getRoots() {
        if (items != null) {
            List<String> ids = StreamUtil.as(items).map(Item::getId).toList();
            return StreamUtil.as(items).filter(item -> !ids.contains(item.getParentId())).toList();
        }
        return new ArrayList<>();
    }

    /**
     * 数据项
     */
    @Getter
    @Setter
    public static class Item {
        /**
         * 资源id
         */
        private String id;
        /**
         * 资源类型： 目录、数据资源、文件
         */
        private DirectoryType directoryType;
        /**
         * 所属（父）目录ID
         */
        private String parentId;

        /**
         * 下级节点
         */
        private List<Item> children = new ArrayList<>();
    }
}
