package errorsx

import (
	"agent-desk/internal/pkg/i18nx"

	"github.com/mlogclub/simple/web"
)

const (
	CodeInvalidParam         = 1000
	CodeBusinessError        = 2000
	CodeAuthUnauthorized     = 3000
	CodeAuthForbidden        = 3001
	CodeAuthInvalidToken     = 3002
	CodeAuthInvalidAccount   = 3003
	CodeAuthCredentialLocked = 3004
)

func InvalidParam(message string) error {
	return web.NewError(CodeInvalidParam, message)
}

func InvalidParamI18n(key string, args ...any) error {
	return NewI18nError(CodeInvalidParam, key, args...)
}

func BusinessError(code int, message string) error {
	return web.NewError(CodeBusinessError+code, message)
}

func BusinessErrorI18n(code int, key string, args ...any) error {
	return NewI18nError(CodeBusinessError+code, key, args...)
}

func Unauthorized(message string) error {
	return web.NewError(CodeAuthUnauthorized, message)
}

func UnauthorizedI18n(key string, args ...any) error {
	return NewI18nError(CodeAuthUnauthorized, key, args...)
}

func Forbidden(message string) error {
	return web.NewError(CodeAuthForbidden, message)
}

func ForbiddenI18n(key string, args ...any) error {
	return NewI18nError(CodeAuthForbidden, key, args...)
}

func InvalidToken(message string) error {
	return web.NewError(CodeAuthInvalidToken, message)
}

func InvalidTokenI18n(key string, args ...any) error {
	return NewI18nError(CodeAuthInvalidToken, key, args...)
}

func InvalidAccount(message string) error {
	return web.NewError(CodeAuthInvalidAccount, message)
}

func InvalidAccountI18n(key string, args ...any) error {
	return NewI18nError(CodeAuthInvalidAccount, key, args...)
}

func CredentialLocked(message string) error {
	return web.NewError(CodeAuthCredentialLocked, message)
}

func CredentialLockedI18n(key string, args ...any) error {
	return NewI18nError(CodeAuthCredentialLocked, key, args...)
}

type I18nError struct {
	Code int
	Key  string
	Args []any
}

func NewI18nError(code int, key string, args ...any) *I18nError {
	return &I18nError{Code: code, Key: key, Args: args}
}

func (e *I18nError) Error() string {
	if e == nil {
		return ""
	}
	return e.Message(i18nx.LocaleZhCN)
}

func (e *I18nError) Unwrap() error {
	if e == nil {
		return nil
	}
	return web.NewError(e.Code, e.Error())
}

func (e *I18nError) Message(locale string) string {
	if e == nil {
		return ""
	}
	return i18nx.Getf(locale, e.Key, e.Args...)
}

func (e *I18nError) JsonResult(locale string) *web.JsonResult {
	if e == nil {
		return web.JsonSuccess()
	}
	return web.JsonErrorCode(e.Code, e.Message(locale))
}
