package requests

import (
	"bytes"
	"errors"
	"net/http"
	"reflect"
)

func buildBodyRequest(wf *Workflow) *http.Request {
	var req *http.Request
	var err error
	contentType := ""

	if wf.Body.GetIOBody() == nil {
		req, err = http.NewRequest(wf.Method, wf.GetRawURL(), nil)
	} else {
		var bodybuf *bytes.Buffer
		switch wf.Body.GetIOBody().(type) {
		case []byte:
			bodybuf = bytes.NewBuffer(wf.Body.GetIOBody().([]byte))
		case string:
			bodybuf = bytes.NewBuffer([]byte(wf.Body.GetIOBody().(string)))
		case *bytes.Buffer:
			bodybuf = bytes.NewBuffer(wf.Body.GetIOBody().(*bytes.Buffer).Bytes())
		default:
			panic(errors.New("the type is not exist, type is " + reflect.TypeOf(wf.Body.GetIOBody()).String()))
		}
		req, err = http.NewRequest(wf.Method, wf.GetRawURL(), bodybuf)
	}

	if err != nil {
		panic(err)
	}

	if wf.Body.ContentType() != "" {
		contentType = wf.Body.ContentType()
	} else {
		contentType = ""
		if contentType == "" {
			if wf.Method == "POST" || wf.Method == "PUT" || wf.Method == "PATCH" {
				contentType = TypeURLENCODED
			}
		}
	}

	if contentType != "" {
		req.Header.Set(HeaderKeyContentType, contentType)
	}

	return req

}