package element

import (
	"git.nspix.com/golang/pgenr/internal/pool"
	"golang.org/x/net/html/atom"
)

type (
	entryItem struct {
		Label   Element
		Content Element
	}
	Entry struct {
		Title Element
		Items []entryItem
		Outro Element
	}
)

func (element *Entry) Html() string {
	return element.String()
}

func (element *Entry) String() string {
	br := pool.Get()
	defer pool.Put(br)
	br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "grid"}))
	if element.Title != nil {
		br.WriteString(element.Title.Html())
	}
	for _, v := range element.Items {
		br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "row"}))
		br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "preview-label"}))
		br.WriteString(v.Label.Html())
		br.WriteString(endTag(atom.Div.String()))
		br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "preview-value"}))
		br.WriteString(v.Content.Html())
		br.WriteString(endTag(atom.Div.String()))
		br.WriteString(endTag(atom.Div.String()))
	}
	if element.Outro != nil {
		br.WriteString(element.Outro.Html())
	}
	br.WriteString(endTag(atom.Div.String()))
	return br.String()
}

func (element *Entry) PushItem(label Element, content Element) *Entry {
	if element.Items == nil {
		element.Items = make([]entryItem, 0)
	}
	element.Items = append(element.Items, entryItem{
		Label:   label,
		Content: content,
	})
	return element
}

func (element *Entry) AddItem(label string, e Element) *Entry {
	return element.PushItem(NewText(label), e)
}

func NewEntry(element Element) *Entry {
	return &Entry{
		Title: element,
		Items: make([]entryItem, 0),
	}
}