package gperr

import (
	"fmt"
	"reflect"
)

type MultilineError struct {
	nestedError
}

func Multiline() *MultilineError {
	return &MultilineError{}
}

func (m *MultilineError) add(err error) {
	m.Extras = append(m.Extras, err)
}

func (m *MultilineError) Addf(format string, args ...any) *MultilineError {
	m.add(fmt.Errorf(format, args...))
	return m
}

func (m *MultilineError) Adds(s string) *MultilineError {
	m.add(newError(s))
	return m
}

func (m *MultilineError) AddLines(lines ...any) *MultilineError {
	v := reflect.ValueOf(lines)
	if v.Kind() == reflect.Slice {
		for i := range v.Len() {
			switch v := v.Index(i).Interface().(type) {
			case string:
				m.add(newError(v))
			case error:
				m.add(v)
			default:
				m.add(fmt.Errorf("%v", v))
			}
		}
	}
	return m
}