package env

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
	"net/http/httptest"

	"github.com/gin-gonic/gin"

	"github.com/pingcap-inc/clinic/pkg/auth/session"
	"github.com/pingcap-inc/clinic/pkg/config"
	"github.com/pingcap-inc/clinic/pkg/rbac"
)

func EnvironmentInit(m string, method func(c *gin.Context), params []gin.Param, body []byte, query string, rbac *rbac.AuthCasbin, logconfig *config.LogConfig) int {
	/*var errs error
	var Invites = []org2.Invite{
		{
			UserName: "test_101_user",
			RoleID:   uint(101),
		},
		{
			UserName: "test_102_user",
			RoleID:   uint(102),
		},
		{
			UserName: "test_103_user",
			RoleID:   uint(103),
		},
		{
			UserName: "test_104_user",
			RoleID:   uint(104),
		},
	}
	stream.OfSlice(Invites).Each(func(i org2.Invite) {
		errs = multierr.Append(errs, invite(i, rbac, 1))
	})*/

	status := setHandler(m, method, params, body, query)
	return status
}

func setHandler(m string, method func(c *gin.Context), params []gin.Param, body []byte, query string) int {
	w := httptest.NewRecorder()
	context, _ := gin.CreateTestContext(w)
	context.Set(session.CtxUserKey, &session.CtxUser{
		Username:        "test_user01",
		UserID:          1,
		Email:           "test01@pingcap.com",
		Internal:        true,
		OrgIDInApiToken: 1,
	})
	switch m {
	case http.MethodGet:
		context.Request = httptest.NewRequest(http.MethodGet, "http://127.0.0.1:8080"+query, nil)
		context.Params = params
	case http.MethodPost:
		context.Request = httptest.NewRequest(http.MethodPost, "http://127.0.0.1:8080"+query, bytes.NewReader(body))
		context.Params = params
		context.Request.Header.Set("Content-Type", "application/json")
	case http.MethodPut:
		context.Request = httptest.NewRequest(http.MethodPut, "http://127.0.0.1:8080"+query, bytes.NewReader(body))
		context.Params = params
		context.Request.Header.Set("Content-Type", "application/json")
	case http.MethodDelete:
		context.Request = httptest.NewRequest(http.MethodDelete, "http://127.0.0.1:8080"+query, bytes.NewReader(body))
		context.Params = params
		context.Request.Header.Set("Content-Type", "application/json")
	default:
		panic(fmt.Errorf("unknow http method"))
	}
	method(context)
	if w.Body != nil {
		body, err := io.ReadAll(w.Body)
		if err != nil {
			err = fmt.Errorf("TestPostReq io.ReadAll() err: %s", err)
			panic(err)
		}
		fmt.Println("respBody: ", string(body))
	}
	return w.Code
}
