package util

import (
	"reflect"

	"go.buf.build/protocolbuffers/go/linuxgit/tidbcloud/base"
)

func SetTagIntoReq(req interface{}, k, v string) {
	typed := GetBaseReqFromReq(req)
	if typed == nil {
		return
	}
	if typed.Tags == nil {
		typed.Tags = map[string]string{}
	}

	typed.Tags[k] = v
}

func GetTagsFromReq(req interface{}) map[string]string {
	typed := GetBaseReqFromReq(req)
	if typed == nil {
		return nil
	}

	return typed.Tags
}

func SetCodeMsg(resp interface{}, code int64, msg string) {
	typed := GetBaseRespFromResp(resp)
	if typed == nil {
		return
	}

	typed.ErrCode = code
	typed.ErrMsg = msg
}

func SetTagIntoResp(resp interface{}, k, v string) {
	typed := GetBaseRespFromResp(resp)
	if typed == nil {
		return
	}

	typed.Tags[k] = v
}

func GetBaseReqFromReq(req interface{}) *base.BaseReq {
	if req == nil {
		return nil
	}

	baseReq := reflect.ValueOf(req).Elem().FieldByName("BaseReq")
	if !baseReq.IsValid() { // don't have BaseReq field
		return nil
	}
	if baseReq.IsNil() {
		baseReq.Set(reflect.New(baseReq.Type().Elem()))
	}
	typed, ok := baseReq.Interface().(*base.BaseReq)
	if !ok {
		return nil
	}
	return typed
}

func GetBaseRespFromResp(resp interface{}) *base.BaseResp {
	if resp == nil {
		return nil
	}

	baseResp := reflect.ValueOf(resp).Elem().FieldByName("BaseResp")
	if !baseResp.IsValid() { // don't have BaseReq field
		return nil
	}
	if baseResp.IsNil() {
		baseResp.Set(reflect.New(baseResp.Type().Elem()))
	}

	typed, ok := baseResp.Interface().(*base.BaseResp)
	if !ok {
		return nil
	}
	return typed
}
