package deps

import (
	"fmt"
	"io"
	"os"
	"sync"
)

// prefixWriter mirrors dev/proc/prefixWriter but is local to deps to avoid an
// import cycle (deps does not depend on dev/proc).
type prefixWriter struct {
	dst     io.Writer
	prefix  string
	mu      sync.Mutex
	lineBuf []byte
}

func newPrefixWriter(name string) *prefixWriter {
	return &prefixWriter{dst: os.Stderr, prefix: name}
}

func (w *prefixWriter) Write(p []byte) (int, error) {
	w.mu.Lock()
	defer w.mu.Unlock()
	for _, b := range p {
		if b == '\n' {
			w.lineBuf = append(w.lineBuf, b)
			if _, err := fmt.Fprintf(w.dst, "[%s] %s", w.prefix, w.lineBuf); err != nil {
				return len(p), err
			}
			w.lineBuf = w.lineBuf[:0]
			continue
		}
		w.lineBuf = append(w.lineBuf, b)
	}
	if len(w.lineBuf) > 0 {
		_, _ = fmt.Fprintf(w.dst, "[%s] %s", w.prefix, w.lineBuf)
		w.lineBuf = w.lineBuf[:0]
	}
	return len(p), nil
}
