package transformer

import (
	"context"
	"io"
)

type writer interface {
	Write(ctx context.Context, p []byte) (n int, err error)
}

type multiWriter struct {
	writers []writer
}

func (t *multiWriter) Write(ctx context.Context, p []byte) (n int, err error) {
	for _, w := range t.writers {
		n, err = w.Write(ctx, p)
		if err != nil {
			return
		}
		if n != len(p) {
			err = io.ErrShortWrite
			return
		}
	}
	return len(p), nil
}

func newMultiWriter(writers ...writer) writer {
	allWriters := make([]writer, 0, len(writers))
	for _, w := range writers {
		if mw, ok := w.(*multiWriter); ok {
			allWriters = append(allWriters, mw.writers...)
		} else {
			allWriters = append(allWriters, w)
		}
	}
	return &multiWriter{allWriters}
}

type writerWrapper struct {
	Writer io.Writer
}

func (w *writerWrapper) Write(_ context.Context, p []byte) (n int, err error) {
	return w.Writer.Write(p)
}

func newWriter(w io.Writer) writer {
	return &writerWrapper{Writer: w}
}