package gweb

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/gotoeasy/glang/cmn"
)

type HttpRequest struct {
	GinCtx  *gin.Context
	mapHead map[string][]string
}

func NewHttpRequest(c *gin.Context) *HttpRequest {

	// header整理，键忽略大小写
	mapHead := make(map[string][]string)
	for k, v := range c.Request.Header {
		key := cmn.ToLower(k)
		val := mapHead[key]
		if val == nil {
			val = []string{}
		}
		val = append(val, v...)
		mapHead[key] = val
	}

	return &HttpRequest{
		GinCtx:  c,
		mapHead: mapHead,
	}
}

func (r *HttpRequest) SetHeader(key string, value string) {
	r.GinCtx.Header(key, value)
}

func (r *HttpRequest) GetHeader(name string) string {
	ary := r.mapHead[cmn.ToLower(name)]
	if ary == nil {
		return ""
	}
	return ary[0]
}

func (r *HttpRequest) GetHeaders(name string) []string {
	ary := r.mapHead[cmn.ToLower(name)]
	if ary == nil {
		return []string{}
	}
	return ary
}

func (r *HttpRequest) GetUrlParameter(name string) string {
	return r.GinCtx.Query(name)
}

func (r *HttpRequest) GetFormParameter(name string) string {
	return r.GinCtx.Request.PostFormValue(name)
}

func (r *HttpRequest) Redirect(url string) {
	r.GinCtx.Redirect(http.StatusMovedPermanently, url)
}

func (r *HttpRequest) ResponseData(code int, contentType string, bytes []byte) {
	r.GinCtx.Data(code, contentType, bytes)
}

func (r *HttpRequest) GetMethod() string {
	return r.GinCtx.Request.Method
}

func (r *HttpRequest) AbortWithStatus(code int) {
	r.GinCtx.AbortWithStatus(code)
}

func (r *HttpRequest) RequestURI() string {
	return r.GinCtx.Request.RequestURI
}

func (r *HttpRequest) RequestUrlPath() string {
	return r.GinCtx.Request.URL.Path
}

func (r *HttpRequest) BindJSON(obj any) error {
	return r.GinCtx.BindJSON(obj)
}
