// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.

// common-errors.go
package expr

import (
	"fmt"
)

func ErrTooFewParams(funcName string, minArgs, maxArgs, argCount int) (err error) {
	if maxArgs < 0 {
		err = fmt.Errorf("%s(): too few params -- expected %d or more, got %d", funcName, minArgs, argCount)
	} else {
		err = fmt.Errorf("%s(): too few params -- expected %d, got %d", funcName, minArgs, argCount)
	}
	return
}

func ErrTooMuchParams(funcName string, maxArgs, argCount int) (err error) {
	err = fmt.Errorf("%s(): too much params -- expected %d, got %d", funcName, maxArgs, argCount)
	return
}

// --- General errors

func ErrCantConvert(funcName string, value any, kind string) error {
	return fmt.Errorf("%s(): can't convert %s to %s", funcName, TypeName(value), kind)
}

func ErrExpectedGot(funcName string, kind string, value any) error {
	return fmt.Errorf("%s(): expected %s, got %s (%v)", funcName, kind, TypeName(value), value)
}

func ErrFuncDivisionByZero(funcName string) error {
	return fmt.Errorf("%s(): division by zero", funcName)
}

func ErrDivisionByZero() error {
	return fmt.Errorf("division by zero")
}

// --- Parameter errors

func ErrMissingRequiredParameter(funcName, paramName string) error {
	return fmt.Errorf("%s(): missing required parameter %q", funcName, paramName)
}

func ErrInvalidParameterValue(funcName, paramName string, paramValue any) error {
	return fmt.Errorf("%s(): invalid value %s (%v) for parameter %q", funcName, TypeName(paramValue), paramValue, paramName)
}

func ErrWrongParamType(funcName, paramName, paramType string, paramValue any) error {
	return fmt.Errorf("%s(): the %q parameter must be a %s, got a %s (%v)", funcName, paramName, paramType, TypeName(paramValue), paramValue)
}