package api

import (
	"reflect"
)

type SortByType string
type OrderType string

const (
	SortByTypeCreatedAt SortByType = "created_at"
	SortByTypeTimezone  SortByType = "timezone"
	OrderTypeASC        OrderType  = "asc"
	OrderTypeDESC       OrderType  = "desc"
)

// 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 ErrCode, message string, traceID string) {
	objValue := reflect.ValueOf(objPtr)
	if objValue.Kind() != reflect.Ptr || objValue.IsNil() {
		return
	}

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

	baseRespValue := objValue.Elem().FieldByName("BaseResp")
	if !baseRespValue.IsValid() {
		return
	}

	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)
	}
}

type BaseResp struct {
	ErrCode    ErrCode `json:"errcode"`
	ErrMessage string  `json:"errmsg"`
	TraceID    string  `json:"trace_id"`
}

type PaginationReq struct {
	Page    uint32 `form:"page,default=1,gt=0" json:"page"`
	PerPage uint32 `form:"per_page,default=100,gt=0,lte=100" json:"per_page"`
}

type PaginationCursorReq struct {
	Cursor  string `form:"cursor" json:"cursor"`
	PerPage uint32 `form:"per_page,default=100,gt=0,lte=100" json:"per_page"`
}

type EmptyResp struct {
}
