package errorarray

import (
	"fmt"
	"strings"
)

type Errors struct {
	Msg     string
	Wrapped []error
}

var _ error = (*Errors)(nil)

func Wrap(errs []error, msg string) Errors {
	if len(errs) == 0 {
		panic("passing empty errs argument")
	}
	return Errors{Msg: msg, Wrapped: errs}
}

func (e Errors) Unwrap() error {
	if len(e.Wrapped) == 1 {
		return e.Wrapped[0]
	}
	return nil // ... limitation of the Go 1.13 errors API
}

func (e Errors) Error() string {
	if len(e.Wrapped) == 1 {
		return fmt.Sprintf("%s: %s", e.Msg, e.Wrapped[0])
	}
	var buf strings.Builder
	fmt.Fprintf(&buf, "%s: multiple errors:\n", e.Msg)
	for i, err := range e.Wrapped {
		fmt.Fprintf(&buf, "%s", err)
		if i != len(e.Wrapped)-1 {
			fmt.Fprintf(&buf, "\n")
		}
	}
	return buf.String()

}