package menu

import "hyapp-admin-server/internal/model"

type menuNode struct {
	ID             uint       `json:"id"`
	ParentID       *uint      `json:"parentId"`
	Code           string     `json:"code"`
	Label          string     `json:"label"`
	Path           string     `json:"path"`
	Icon           string     `json:"icon"`
	PermissionCode string     `json:"permissionCode"`
	Sort           int        `json:"sort"`
	Visible        bool       `json:"visible"`
	Children       []menuNode `json:"children,omitempty"`
}

func menuNodeFromModel(menu model.Menu) menuNode {
	return menuNode{
		ID:             menu.ID,
		ParentID:       menu.ParentID,
		Code:           menu.Code,
		Label:          menu.Title,
		Path:           menu.Path,
		Icon:           menu.Icon,
		PermissionCode: menu.PermissionCode,
		Sort:           menu.Sort,
		Visible:        menu.Visible,
		Children:       []menuNode{},
	}
}

func buildMenuTree(menus []model.Menu) []menuNode {
	nodes := map[uint]*menuNode{}
	for _, item := range menus {
		node := menuNodeFromModel(item)
		nodes[item.ID] = &node
	}

	for _, item := range menus {
		node := nodes[item.ID]
		if item.ParentID != nil {
			if parent, ok := nodes[*item.ParentID]; ok {
				parent.Children = append(parent.Children, *node)
			}
		}
	}

	roots := make([]menuNode, 0)
	for _, item := range menus {
		if item.ParentID == nil {
			roots = append(roots, *nodes[item.ID])
		}
	}
	return roots
}

func pruneEmptyMenuGroups(menus []menuNode) []menuNode {
	out := make([]menuNode, 0, len(menus))
	for _, item := range menus {
		item.Children = pruneEmptyMenuGroups(item.Children)
		if item.Path != "" || len(item.Children) > 0 {
			out = append(out, item)
		}
	}
	return out
}
