package utils

import (
	"reflect"

	"github.com/tidbcloud/dataflow-service/app/config"
	bizerr_wrapper "github.com/tidbcloud/dataflow-service/pkg/bizerr-wrapper"
	"github.com/tidbcloud/pkgv2/bizerr"
)

func CheckParamInvalidError[T any](paramName string, param T, checkFunc func(param T) bool) bizerr.BizError {
	if IsEmpty(param) {
		return bizerr_wrapper.NewInvalidInputError(config.ErrEmptyParam, paramName)
	}

	if checkFunc(param) {
		return nil
	}
	return bizerr_wrapper.NewInvalidInputError(config.ErrInvalidParam, paramName, param)
}

func CheckParamEmptyError[T any](paramName string, param T) bizerr.BizError {
	if IsEmpty(param) {
		return bizerr_wrapper.NewInvalidInputError(config.ErrEmptyParam, paramName)
	}
	return nil
}

func IsEmpty(v interface{}) bool {
	rv := reflect.ValueOf(v)
	switch rv.Kind() {
	case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
		return rv.Len() == 0
	case reflect.Bool:
		return !rv.Bool()
	case reflect.Interface, reflect.Ptr:
		if rv.IsNil() {
			return true
		}
		return IsEmpty(rv.Elem().Interface())
	case reflect.Chan, reflect.Func, reflect.UnsafePointer:
		return rv.IsNil()
	}
	return reflect.DeepEqual(v, reflect.Zero(reflect.TypeOf(v)).Interface())
}
