package httputil

import (
	"fmt"
	"strconv"
)

type JSONError struct {
	err error
}

func (j JSONError) Error() string {
	return "JSON decoding failed: " + j.err.Error()
}

func (j JSONError) Unwrap() error {
	return j.err
}

type RequestError struct {
	err error
}

func (r RequestError) Error() string {
	return "request failed: " + r.err.Error()
}

func (r RequestError) Unwrap() error {
	return r.err
}

type HTTPError struct {
	Status int    `json:"-"`
	Body   []byte `json:"-"`

	Code    ErrorCode `json:"code"`
	Message string    `json:"message,omitempty"`
}

func (err HTTPError) Error() string {
	switch {
	case err.Message != "":
		return fmt.Sprintf("Discord %d error: %s", err.Status, err.Message)

	case err.Code > 0:
		return fmt.Sprintf("Discord returned status %d error code %d",
			err.Status, err.Code)

	case len(err.Body) > 0:
		return fmt.Sprintf("Discord returned status %d body %s",
			err.Status, string(err.Body))

	default:
		return "Discord returned status " + strconv.Itoa(err.Status)
	}
}

type ErrorCode uint