package tree

import (
	"regexp"
)

type Node[T any] struct {
	Data     T         `json:"data"`
	Children []Node[T] `json:"children"`
}

func Length(code string) int {
	re := regexp.MustCompile(`[A-Z]\d+`)
	match := re.FindString(code)
	return len(match)
}

// 适用 A00001B00001 层级结构
// parent 父级字符串
// length A00001 一个节点长度
// pathFunc 返回T的code A00001
func Tree[T any](data []T, parent string, length int, pathFunc func(d T) string) (res []Node[T]) {
	for _, v := range data {
		path := pathFunc(v)
		if len(path) < length {
			return
		}
		p := path[:len(path)-length]
		if p == parent {
			res = append(res, Node[T]{
				Data:     v,
				Children: Tree[T](data, path, length, pathFunc),
			})
		}
	}
	return
}

// 拆分层级结构 A00001B00001C00001 拆分为 ["A00001","A00001B00001","A00001B00001C00001"]
func Split(code string) (res []string) {
	if code == "" {
		return []string{}
	}
	l := Length(code)
	if len(code) < l {
		return
	}

	times := len(code) / l
	for i := 0; i < times; i++ {
		res = append(res, code[:len(code)-l*i])
	}
	return
}