package ffjsoninception

import "strings"

// ConditionalWrite is a stack containing a number of pending writes
type ConditionalWrite struct {
	Queued []string
}

// Write will add a string to be written
func (w *ConditionalWrite) Write(s string) {
	w.Queued = append(w.Queued, s)
}

// DeleteLast will delete the last added write
func (w *ConditionalWrite) DeleteLast() {
	if len(w.Queued) == 0 {
		return
	}
	w.Queued = w.Queued[:len(w.Queued)-1]
}

// Last will return the last added write
func (w *ConditionalWrite) Last() string {
	if len(w.Queued) == 0 {
		return ""
	}
	return w.Queued[len(w.Queued)-1]
}

// Flush will return all queued writes, and return
// "" (empty string) in nothing has been queued
// "buf.WriteByte('" + byte + "')" + '\n' if one bute has been queued.
// "buf.WriteString(`" + string + "`)" + "\n" if more than one byte has been queued.
func (w *ConditionalWrite) Flush() string {
	combined := strings.Join(w.Queued, "")
	if len(combined) == 0 {
		return ""
	}

	w.Queued = nil
	if len(combined) == 1 {
		return "buf.WriteByte('" + combined + "')" + "\n"
	}
	return "buf.WriteString(`" + combined + "`)" + "\n"
}

func (w *ConditionalWrite) FlushTo(out string) string {
	out += w.Flush()
	return out
}

// WriteFlush will add a string and return the Flush result for the queue
func (w *ConditionalWrite) WriteFlush(s string) string {
	w.Write(s)
	return w.Flush()
}

// GetQueued will return the current queued content without flushing.
func (w *ConditionalWrite) GetQueued() string {
	t := w.Queued
	s := w.Flush()
	w.Queued = t
	return s
}