package base

import "reflect"

type BaseResponse struct {
	ErrCode    int    `json:"errcode"`
	ErrMessage string `json:"errmsg"`
	TraceID    string `json:"trace_id,omitempty"`
}

type ErrorResponse struct {
	Error string `json:"error"`
}

// SetBaseResp sets the code and message of the Resp object.
//
// NOTE: objPtr must be a pointer to a struct and embed BaseResp.
func SetBaseResp(objPtr any, code int, message string, traceID string) {
	objValue := reflect.ValueOf(objPtr)
	if objValue.Kind() != reflect.Ptr || objValue.IsNil() {
		return
	}

	if baseResp, ok := objPtr.(*BaseResponse); ok {
		baseResp.ErrCode = code
		baseResp.ErrMessage = message
		baseResp.TraceID = traceID
		return
	}

	baseRespValue := objValue.Elem().FieldByName("BaseResponse")
	if !baseRespValue.IsValid() {
		return
	}
	if baseRespValue.Kind() == reflect.Ptr {
		if baseRespValue.IsNil() {
			baseRespValue.Set(reflect.New(baseRespValue.Type().Elem()))
		}
		baseRespValue = baseRespValue.Elem()
	}

	errcodeVal := baseRespValue.FieldByName("ErrCode")
	errmsgVal := baseRespValue.FieldByName("ErrMessage")
	traceidVal := baseRespValue.FieldByName("TraceID")
	if errcodeVal.CanSet() && errmsgVal.CanSet() {
		errcodeVal.Set(reflect.ValueOf(code))
		errmsgVal.SetString(message)
		traceidVal.SetString(traceID)
	}
}
