package gumbleutil

import (
	"bytes"
	"encoding/xml"
	"strings"

	"github.com/layeh/gumble/gumble"
)

// PlainText returns the Message string without HTML tags or entities.
func PlainText(tm *gumble.TextMessage) string {
	d := xml.NewDecoder(strings.NewReader(tm.Message))
	d.Strict = false
	d.AutoClose = xml.HTMLAutoClose
	d.Entity = xml.HTMLEntity

	var b bytes.Buffer
	newline := false
	for {
		t, _ := d.Token()
		if t == nil {
			break
		}
		switch node := t.(type) {
		case xml.CharData:
			if len(node) > 0 {
				b.Write(node)
				newline = false
			}
		case xml.StartElement:
			switch node.Name.Local {
			case "address", "article", "aside", "audio", "blockquote", "canvas", "dd", "div", "dl", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hgroup", "hr", "noscript", "ol", "output", "p", "pre", "section", "table", "tfoot", "ul", "video":
				if !newline {
					b.WriteByte('\n')
					newline = true
				}
			case "br":
				b.WriteByte('\n')
				newline = true
			}
		}
	}
	return b.String()
}
