package common

import (
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"net/http"
	"os"
	"time"

	compatcst "github.com/tidbcloud/infra-provider/pkg/compat/consts"
	models "github.com/tidbcloud/infra-provider/pkg/compat/models"
	"github.com/tidbcloud/tiinf/transport/crossregion"
	"sigs.k8s.io/controller-runtime/pkg/log"
)

var timeout = 10 * time.Second

func getGRPCErrorCode(respStr string) (int, error, bool) {
	var resp models.GooglerpcStatus
	err := json.Unmarshal([]byte(respStr), &resp)
	if err != nil {
		return 0, nil, false
	}
	if resp.Code == 0 && resp.Message == "" {
		return 0, nil, false
	}
	return int(resp.Code), errors.New(resp.Message), true
}

func GetGlobalHTTP[T any](ctx context.Context, envType crossregion.EnvType, requrlTpml, id string, data *map[string]string) (*T, int, error) {
	logger := log.FromContext(ctx).WithName("CompatHttpClient")
	authKey := os.Getenv(compatcst.EnvKeyCompatXRegionAuthKey)
	client := crossregion.NewBasicAuthClient(envType, authKey, timeout)
	respStr, httpCode, err := client.GetGlobal(ctx, fmt.Sprintf(requrlTpml, id), data)
	if err != nil {
		logger.Error(err, "GetGlobalHTTP failed", "respStr", respStr, "httpCode", httpCode)
		return nil, compatcst.CodeInternalError, err
	}
	if httpCode != http.StatusOK {
		logger.Info("GetGlobalHTTP Status not ok ", "respStr", respStr, "httpCode", httpCode)
		return nil, httpCode, nil
	}
	if code, err, ok := getGRPCErrorCode(respStr); ok {
		logger.Error(err, "GetGlobalHTTP GRPC error ", "respStr", respStr, "httpCode", httpCode)
		return nil, code, err
	}
	var resp T
	err = json.Unmarshal([]byte(respStr), &resp)
	if err != nil {
		logger.Error(err, "GetGlobalHTTP Unmarshal failed", "respStr", respStr, "httpCode", httpCode)
		return nil, compatcst.CodeInternalError, err
	}
	return &resp, httpCode, nil
}
