package d2term

import (
	"bufio"
	"bytes"
	"io"
	"strings"
)

type terminalLogger struct {
	terminal *Terminal
	buffer   bytes.Buffer
	writer   io.Writer
}

func (tl *terminalLogger) Write(p []byte) (int, error) {
	n, err := tl.buffer.Write(p)
	if err != nil {
		return n, err
	}

	reader := bufio.NewReader(&tl.buffer)
	termBytes, _, err := reader.ReadLine()

	if err != nil {
		return n, err
	}

	line := string(termBytes)
	lineLower := strings.ToLower(line)

	switch {
	case strings.Index(lineLower, "error") > 0:
		tl.terminal.Errorf(line)
	case strings.Index(lineLower, "warning") > 0:
		tl.terminal.Warningf(line)
	default:
		tl.terminal.Printf(line)
	}

	return tl.writer.Write(p)
}

func (tl *terminalLogger) BindToTerminal(t *Terminal) {
	tl.terminal = t
}
