package utils

import (
	"errors"
	"fmt"
	"net/http"

	"github.com/fiskerinc/cloud-services/pkg/common"
)

const ErrCodeJSONRPCParse = -32700
const ErrCodeJSONRPCInvalidRequest = -32600
const ErrCodeJSONRPCMethodNotFound = -32601
const ErrCodeJSONRPCInvalidParams = -32602
const ErrCodeJSONRPCInternalError = -32603
const ErrCodeJSONRPCServerError = -32000

var ErrJSONRPCParse = errors.New("Parse error")
var ErrJSONRPCInvalidRequest = errors.New("Invalid Request")
var ErrJSONRPCMethodNotFound = errors.New("Method not found")
var ErrJSONRPCInvalidParams = errors.New("Invalid params")
var ErrJSONRPCInternalError = errors.New("Internal error")
var ErrJSONRPCServerError = errors.New("Server error")

var ErrCodeJSONRPC map[error]int = map[error]int{
	ErrJSONRPCParse:          ErrCodeJSONRPCParse,
	ErrJSONRPCInvalidRequest: ErrCodeJSONRPCInvalidRequest,
	ErrJSONRPCMethodNotFound: ErrCodeJSONRPCMethodNotFound,
	ErrJSONRPCInvalidParams:  ErrCodeJSONRPCInvalidParams,
	ErrJSONRPCInternalError:  ErrCodeJSONRPCInternalError,
	ErrJSONRPCServerError:    ErrCodeJSONRPCServerError,
}

var StatsCodeJSONRPC map[error]int = map[error]int{
	ErrJSONRPCParse:          http.StatusBadRequest,
	ErrJSONRPCInvalidRequest: http.StatusBadRequest,
	ErrJSONRPCMethodNotFound: http.StatusNotFound,
	ErrJSONRPCInvalidParams:  http.StatusBadRequest,
	ErrJSONRPCInternalError:  http.StatusInternalServerError,
	ErrJSONRPCServerError:    http.StatusServiceUnavailable,
}

func RespJSONRPCError(w http.ResponseWriter, err error, msg string) {
	code, ok := ErrCodeJSONRPC[err]
	if !ok {
		code = ErrCodeJSONRPCInternalError
	}
	resp := common.NewJSONRPCErrorResponse(code, fmt.Sprintf("%v. %s", err.Error(), msg))
	status, ok := StatsCodeJSONRPC[err]
	if !ok {
		status = http.StatusInternalServerError
	}

	RespJSON(w, status, resp)
}
