package whutil

import (
	"bytes"
	"net/http"
	"syscall/js"
)

// Request is a JS Request
type Request js.Value

// HTTPRequest builds and returns this equivalent http.Request
func (r *Request) HTTPRequest() (*http.Request, error) {
	rValue := js.Value(*r)

	jsBody := js.Global().Get("Uint8Array").New(Promise(rValue.Call("arrayBuffer")).Await())
	body := make([]byte, jsBody.Get("length").Int())
	js.CopyBytesToGo(body, jsBody)

	req, err := http.NewRequest(
		rValue.Get("method").String(),
		rValue.Get("url").String(),
		bytes.NewBuffer(body),
	)
	if err != nil {
		return nil, err
	}

	headersIt := rValue.Get("headers").Call("entries")
	for {
		v := headersIt.Call("next")
		if v.Get("done").Bool() {
			break
		}
		req.Header.Set(v.Index(0).String(), v.Index(1).String())
	}

	return req, nil
}
