/*
 * @description: 项目节模板
 * @Author: CP
 * @Date: 2020-10-29 09:44:20
 * @FilePath: \construction_management\lib\item_section.go
 */
package lib

import (
	"encoding/json"
	"io/ioutil"
	"log"
)

type ItemSection struct {
	TemplateTree1 *ItemSectionTemplateTree
	TemplateList1 []*ItemSectionTemplateTree
	TemplateRule1 string
	TemplateTree2 *ItemSectionTemplateTree
	TemplateList2 []*ItemSectionTemplateTree
	TemplateRule2 string
}

// 初始化项目节-树结构
func NewItemSection() *ItemSection {
	return &ItemSection{
		TemplateTree1: makeItemSectionTemplateTree("1"),
		TemplateRule1: "-",
		TemplateTree2: makeItemSectionTemplateTree("2"),
		TemplateRule2: "-",
	}
}

func NewItemSectionData() *ItemSection {
	return &ItemSection{
		TemplateList1: makeTemplateData("1"),
		TemplateRule1: "-",
		TemplateList2: makeTemplateData("2"),
		TemplateRule2: "-",
	}
}

// 项目节模板
type ItemSectionTemplateTree struct {
	Id          int                        `form:"id" json:"id" `
	ParentId    int                        `form:"parentId" json:"parentId"`
	Name        string                     `form:"name" json:"name"`
	Depth       int                        `form:"depth" json:"depth"`
	Serial      int                        `form:"serial" json:"serial"`
	Attribution string                     `form:"attribution" json:"attribution"`
	Leaf        bool                       `json:"leaf" `
	Children    []*ItemSectionTemplateTree `json:"children"`

	IsEnd bool `json:"isEnd"`
}

// 获得项目节模板数据
func makeTemplateData(templateNumber string) []*ItemSectionTemplateTree {
	templateList := make([]*ItemSectionTemplateTree, 0)
	// 读取模板文件
	data, err := ioutil.ReadFile("../lib/section_template" + templateNumber + ".json")
	if err != nil {
		log.Println("项目节模板文件读取出错:err=", err)
		return nil
	}

	err = json.Unmarshal(data, &templateList)
	if err != nil {
		log.Println("项目节模板Json转换出错:err=", err)
		return nil
	}
	return templateList
}

// 初始化项目节模板
// func NewTemplate() Template {
// 	return nil
// }
// 生成树
func makeItemSectionTemplateTree(templateNumber string) *ItemSectionTemplateTree {
	// templateList := make([]*ItemSectionTemplateTree, 0)
	// // 读取模板文件
	// data, err := ioutil.ReadFile("../lib/" + fileName)
	// if err != nil {
	// 	log.Println("项目节模板文件读取出错:err=", err)
	// 	return nil
	// }

	// err = json.Unmarshal(data, &templateList)
	// if err != nil {
	// 	log.Println("项目节模板Json转换出错:err=", err)
	// 	return nil
	// }
	templateList := makeTemplateData(templateNumber)

	// 生成根
	template := &ItemSectionTemplateTree{}
	template.Id = 0
	template.Name = "root"
	template.ParentId = -1
	templateList = append(templateList, template)

	node := template             //父节点
	maketree(templateList, node) //调用生成tree
	return node
}

// 创建一颗树...interface{}
func maketree(Data []*ItemSectionTemplateTree, node *ItemSectionTemplateTree) { //参数为父节点，添加父节点的子节点指针切片
	childs, _ := havechild(Data, node) //判断节点是否有子节点并返回
	if childs != nil {
		// 子节点总数
		Total := len(childs)
		// 标记最后一个元素
		end := Total - 1
		childs[end].IsEnd = true
		// 往父节点添加子节点
		node.Children = append(node.Children, childs[0:]...) //添加子节点
		for _, v := range childs {                           //查询子节点的子节点，并添加到子节点
			_, has := havechild(Data, v)
			if has {
				// 递归添加节点
				maketree(Data, v)
			}
			// else {
			// 	// 叶子节点
			// 	node.Leaf = false
			// }

		}
	}
}

// 是否有子树
func havechild(Data []*ItemSectionTemplateTree, node *ItemSectionTemplateTree) (child []*ItemSectionTemplateTree, yes bool) {
	for _, v := range Data {
		if v.ParentId == node.Id {
			child = append(child, v)
		}
	}
	if child != nil {
		yes = true
	}
	return
}
