package util

import (
	"errors"

	"github.com/sirupsen/logrus"
)

type ContextualError struct {
	RealError error
	Fields    map[string]interface{}
	Context   string
}

func NewContextualError(msg string, fields map[string]interface{}, realError error) ContextualError {
	return ContextualError{Context: msg, Fields: fields, RealError: realError}
}

func (ce ContextualError) Error() string {
	if ce.RealError == nil {
		return ce.Context
	}
	return ce.RealError.Error()
}

func (ce ContextualError) Unwrap() error {
	if ce.RealError == nil {
		return errors.New(ce.Context)
	}
	return ce.RealError
}

func (ce *ContextualError) Log(lr *logrus.Logger) {
	if ce.RealError != nil {
		lr.WithFields(ce.Fields).WithError(ce.RealError).Error(ce.Context)
	} else {
		lr.WithFields(ce.Fields).Error(ce.Context)
	}
}
