package httptt

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"testing"

	"gitee.com/xuyiping_admin/pkg/jsonpb"

	"github.com/golang/protobuf/proto"
	"github.com/stretchr/testify/require"
)

func NewRequest(t *testing.T, method, path string, body proto.Message) *http.Request {
	var (
		req *http.Request
		err error
	)
	switch method {
	case http.MethodGet, http.MethodDelete:
		var url string
		if body != nil {
			v := MarshalQueryPB(body)
			query := v.Encode()
			url = fmt.Sprintf("%s?%s", path, query)
		} else {
			url = path
		}
		req, err = http.NewRequest(method, url, nil)
		require.NoError(t, err)
	default:
		if body != nil {
			bs, err := jsonpb.MarshalBytes(body)
			require.NoError(t, err)
			req, err = http.NewRequest(method, path, bytes.NewReader(bs))
			require.NoError(t, err)
		} else {
			req, err = http.NewRequest(method, path, nil)
			require.NoError(t, err)
		}
	}
	return req
}

func NewRequest2(t *testing.T, method, path string, body interface{}) *http.Request {
	var (
		req *http.Request
		err error
	)
	switch method {
	case http.MethodGet:
		var url string
		url = path
		req, err = http.NewRequest(http.MethodGet, url, nil)
		require.NoError(t, err)
	default:
		if body != nil {
			bs, err := json.Marshal(body)
			require.NoError(t, err)
			req, err = http.NewRequest(method, path, bytes.NewReader(bs))
			require.NoError(t, err)
		} else {
			req, err = http.NewRequest(method, path, nil)
			require.NoError(t, err)
		}
	}
	return req
}