package ginWrapper

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/errors"
	"github.com/samber/mo"
	"golang.org/x/exp/constraints"

	"github.com/pingcap-inc/chaosAPI/pkg/wrapper/strconv"
)

func HasParam(c *gin.Context, name string) bool {
	_, ok := c.Params.Get(name)
	return ok
}

func IntegerParam[T constraints.Integer](c *gin.Context, key string) mo.Result[T] {
	if key == "" {
		return mo.Err[T](errors.Errorf("key: %s is empty", key))
	}
	param := c.Param(key)
	if param == "" {
		return mo.Err[T](errors.Errorf("param: %s not found", key))
	}
	integer, err := strconv.ToInteger[T](param, 10)
	if err != nil {
		return mo.Err[T](errors.Errorf("param: %s is not a valid integer, with error: %s", key, err.Error()))
	}
	return mo.Ok[T](integer)
}

func HasQuery(c *gin.Context, name string) bool {
	_, ok := c.GetQuery(name)
	return ok
}

func IntegerQuery[T constraints.Integer](c *gin.Context, key string) mo.Result[T] {
	if key == "" {
		return mo.Err[T](errors.Errorf("key: %s is empty", key))
	}
	param := c.Query(key)
	if param == "" {
		return mo.Err[T](errors.Errorf("query: %s not found", key))
	}
	integer, err := strconv.ToInteger[T](param, 10)
	if err != nil {
		return mo.Err[T](errors.Errorf("query: %s is not a valid integer, with error: %s", key, err.Error()))
	}
	return mo.Ok[T](integer)
}

func BadRequest(c *gin.Context, err error) {
	c.Status(http.StatusBadRequest)
	_ = c.Error(err)
}

func InternalServerError(c *gin.Context, err error) {
	c.Status(http.StatusInternalServerError)
	_ = c.Error(err)
}
