package segments

import (
	"github.com/diamondburned/cchat/text"
	"github.com/yuin/goldmark/ast"
)

type CodeblockSegment struct {
	start, end int
	language   string
}

var _ text.Codeblocker = (*CodeblockSegment)(nil)

func (r *TextRenderer) codeblock(n *ast.FencedCodeBlock, enter bool) ast.WalkStatus {
	if enter {
		// Open the block by adding formatting and all.
		r.startBlock()
		r.buf.WriteString("---\n")

		// Create a segment.
		seg := CodeblockSegment{
			start:    r.buf.Len(),
			language: string(n.Language(r.src)),
		}

		// Join all lines together.
		var lines = n.Lines()

		for i := 0; i < lines.Len(); i++ {
			line := lines.At(i)
			r.buf.Write(line.Value(r.src))
		}

		// Close the segment.
		seg.end = r.buf.Len()
		r.append(seg)

		// Close the block.
		r.buf.WriteString("\n---")
		r.endBlock()
	}

	return ast.WalkContinue
}

func (c CodeblockSegment) Bounds() (start, end int) {
	return c.start, c.end
}

func (c CodeblockSegment) CodeblockLanguage() string {
	return c.language
}