package http

import (
	"net/http"

	"github.com/go-kratos/kratos/v2/errors"
)

var (
	// References: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
	codesMapping = map[int32]int{
		0:  http.StatusOK,
		1:  http.StatusInternalServerError,
		2:  http.StatusInternalServerError,
		3:  http.StatusBadRequest,
		4:  http.StatusRequestTimeout,
		5:  http.StatusNotFound,
		6:  http.StatusConflict,
		7:  http.StatusForbidden,
		8:  http.StatusTooManyRequests,
		9:  http.StatusPreconditionFailed,
		10: http.StatusConflict,
		11: http.StatusBadRequest,
		12: http.StatusNotImplemented,
		13: http.StatusInternalServerError,
		14: http.StatusServiceUnavailable,
		15: http.StatusInternalServerError,
		16: http.StatusUnauthorized,
	}
	statusMapping = map[int]int32{
		http.StatusOK:                  0,
		http.StatusBadRequest:          3,
		http.StatusRequestTimeout:      4,
		http.StatusNotFound:            5,
		http.StatusConflict:            6,
		http.StatusForbidden:           7,
		http.StatusUnauthorized:        16,
		http.StatusPreconditionFailed:  9,
		http.StatusNotImplemented:      12,
		http.StatusInternalServerError: 13,
		http.StatusServiceUnavailable:  14,
	}
)

// StatusError converts error to status error.
func StatusError(err error) (*errors.StatusError, int) {
	se, ok := errors.FromError(err)
	if !ok {
		se = &errors.StatusError{
			Code:    2,
			Reason:  "Unknown",
			Message: "Unknown: " + err.Error(),
		}
	}
	if status, ok := codesMapping[se.Code]; ok {
		return se, status
	}
	return se, http.StatusInternalServerError
}