package twitch

import (
	"fmt"
)

type httpError struct {
	body []byte
	code int
	err  error
}

var errAnyHTTPError = newHTTPError(0, nil, nil)

func newHTTPError(status int, body []byte, wrappedErr error) httpError {
	return httpError{
		body: body,
		code: status,
		err:  wrappedErr,
	}
}

func (h httpError) Error() string {
	selfE := fmt.Sprintf("unexpected status %d", h.code)
	if h.body != nil {
		selfE = fmt.Sprintf("%s (%s)", selfE, h.body)
	}

	if h.err == nil {
		return selfE
	}

	return fmt.Sprintf("%s: %s", selfE, h.err)
}

func (h httpError) Is(target error) bool {
	ht, ok := target.(httpError)
	if !ok {
		return false
	}

	return ht.code == 0 || ht.code == h.code
}

func (h httpError) Unwrap() error {
	return h.err
}