package object

import (
	"net/http"

	"github.com/zitadel/zitadel/internal/actions"
)

// HTTPRequestField accepts the http.Request by value, so it's not mutated
func HTTPRequestField(request *http.Request) func(c *actions.FieldConfig) interface{} {
	return func(c *actions.FieldConfig) interface{} {
		return c.Runtime.ToValue(&httpRequest{
			Method:        request.Method,
			Url:           request.URL.String(),
			Proto:         request.Proto,
			ContentLength: request.ContentLength,
			Host:          request.Host,
			Form:          copyMap(request.Form),
			PostForm:      copyMap(request.PostForm),
			RemoteAddr:    request.RemoteAddr,
			Headers:       copyMap(request.Header),
		})
	}
}

type httpRequest struct {
	Method        string
	Url           string
	Proto         string
	ContentLength int64
	Host          string
	Form          map[string][]string
	PostForm      map[string][]string
	RemoteAddr    string
	Headers       map[string][]string
}

func copyMap(src map[string][]string) map[string][]string {
	dst := make(map[string][]string)
	for k, v := range src {
		dst[k] = v
	}
	return dst
}