package md2man

import (
	"fmt"
	"io"
	"os"
	"strings"

	"github.com/russross/blackfriday/v2"
)

func fmtListFlags(flags blackfriday.ListType) string {
	knownFlags := []struct {
		name string
		flag blackfriday.ListType
	}{
		{"ListTypeOrdered", blackfriday.ListTypeOrdered},
		{"ListTypeDefinition", blackfriday.ListTypeDefinition},
		{"ListTypeTerm", blackfriday.ListTypeTerm},
		{"ListItemContainsBlock", blackfriday.ListItemContainsBlock},
		{"ListItemBeginningOfList", blackfriday.ListItemBeginningOfList},
		{"ListItemEndOfList", blackfriday.ListItemEndOfList},
	}

	var f []string
	for _, kf := range knownFlags {
		if flags&kf.flag != 0 {
			f = append(f, kf.name)
			flags &^= kf.flag
		}
	}
	if flags != 0 {
		f = append(f, fmt.Sprintf("Unknown(%#x)", flags))
	}
	return strings.Join(f, "|")
}

type debugDecorator struct {
	blackfriday.Renderer
}

func depth(node *blackfriday.Node) int {
	d := 0
	for n := node.Parent; n != nil; n = n.Parent {
		d++
	}
	return d
}

func (d *debugDecorator) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus {
	fmt.Fprintf(os.Stderr, "%s%s %v %v\n",
		strings.Repeat("  ", depth(node)),
		map[bool]string{true: "+", false: "-"}[entering],
		node,
		fmtListFlags(node.ListFlags))
	var b strings.Builder
	status := d.Renderer.RenderNode(io.MultiWriter(&b, w), node, entering)
	if b.Len() > 0 {
		fmt.Fprintf(os.Stderr, ">> %q\n", b.String())
	}
	return status
}