package apierror

import (
	"fmt"
	"net/http"
)

// RequestIDError is an error that wraps another error and includes the response ID
type RequestIDError struct {
	Err        error
	ResponseID *string
}

// Error implements error for RequestIDError
func (e *RequestIDError) Error() string {
	if e.ResponseID == nil {
		return e.Err.Error()
	}
	return fmt.Sprintf("[x-response-id:%s]: %v", *e.ResponseID, e.Err)
}

// Unwrap implements errors.Unwrap for RequestIDError
func (e *RequestIDError) Unwrap() error {
	return e.Err
}

// Is implements errors.Is for RequestIDError
func (e *RequestIDError) Is(err error) bool {
	_, ok := err.(*RequestIDError)
	return ok
}

// WithRequestID creates a new RequestIDError
func WithRequestID(err error, headers http.Header) *RequestIDError {
	r := &RequestIDError{Err: err}
	id := headers.Get("X-Response-Id")
	if id != "" {
		r.ResponseID = &id
	}
	return r
}