package apigateway

import (
	"encoding/json"
	"io"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	models "github.com/tidbcloud/metering/pkg/common/utils/apigateway/models"
)

func TestGetGRPCErrorCode(t *testing.T) {
	i, e, o := getGRPCErrorCode(`{"a":"a","b":"b"}`)
	if i != 0 || e != nil || o != false {
		t.Fatal(i, e, o)
	}
	status := models.GooglerpcStatus{
		Code:    -1,
		Message: "error",
	}
	b, err := json.Marshal(status)
	if err != nil {
		t.Fatal(err)
	}
	i, e, o = getGRPCErrorCode(string(b))
	if i != -1 || e.Error() != "error" || o != true {
		t.Fatal(i, e, o)
	}
}

func TestPayLoad(t *testing.T) {
	payload := map[string]string{
		"projectid": "1234",
		"startTS":   "2024-01-01T00:00:00Z",
		"endTS":     "2024-01-02T00:00:00Z",
	}
	body := encodeJSON(payload)
	result, err := io.ReadAll(body)
	if err != nil {
		t.Fatal(err)
	}
	assert.Equal(t, `{"endTS":"2024-01-02T00:00:00Z","projectid":"1234","startTS":"2024-01-01T00:00:00Z"}`, string(result))
	var req models.V1CountBillableClustersRequest
	req.StartTime = time.Unix(1704067200, 0).UTC()
	req.EndTime = time.Unix(1704153600, 0).UTC()
	req.ProjectId = "1234"
	req.OrganizationId = "12345"
	body2 := encodeJSON(req)
	result2, err := io.ReadAll(body2)
	if err != nil {
		t.Fatal(err)
	}
	assert.Equal(t, `{"organizationId":"12345","projectId":"1234","startTime":"2024-01-01T00:00:00Z","endTime":"2024-01-02T00:00:00Z"}`, string(result2))
}

func TestBaseRespError(t *testing.T) {
	var resp models.BaseRespErrorWarp
	resp.BaseResp = &models.BaseRespError{
		ErrCode: 59900104,
		ErrMsg:  "check dedicated allow failed: failed to get org info: the org is not exist, please check the org_id",
	}
	b, err := json.Marshal(resp)
	if err != nil {
		t.Fatal(err)
	}
	assert.Equal(t, "{\"base_resp\":{\"err_code\":59900104,\"err_msg\":\"check dedicated allow failed: failed to get org info: the org is not exist, please check the org_id\"}}", string(b))
}
