package error_wrapper

import (
	"fmt"
	"sync"

	"gorm.io/gorm"

	"github.com/pingcap/errcode"
)

type ErrCodeWrapper struct{}

var (
	errCodeWrapper *ErrCodeWrapper
	errCodeOnce    sync.Once
)

func getErrCodeWrapper() *ErrCodeWrapper {
	errCodeOnce.Do(func() {
		errCodeWrapper = &ErrCodeWrapper{}
	})
	return errCodeWrapper
}

func (e *ErrCodeWrapper) NewInternalErr(format string, a ...any) error {
	return errcode.NewInternalErr(fmt.Errorf(format, a...))
}

func (e *ErrCodeWrapper) NewNotFoundErr(format string, a ...any) error {
	return errcode.NewNotFoundErr(fmt.Errorf(format, a...))
}

func (e *ErrCodeWrapper) NewNotAuthenticatedErr(format string, a ...any) error {
	return errcode.NewNotAuthenticatedErr(fmt.Errorf(format, a...))
}

func (e *ErrCodeWrapper) NewForbiddenErr(format string, a ...any) error {
	return errcode.NewForbiddenErr(fmt.Errorf(format, a...))
}

func (e *ErrCodeWrapper) NewInvalidInputError(format string, a ...any) error {
	return errcode.NewInvalidInputErr(fmt.Errorf(format, a...))
}

func (e *ErrCodeWrapper) WrapGormError(err error, format string, args ...any) error {
	if err == gorm.ErrRecordNotFound {
		return errcode.NewNotFoundErr(err)
	}
	return errcode.NewInternalErr(err)
}
