package stdlib

import (
	"math"

	"github.com/d5/tengo/v2"
)

var mathModule = map[string]tengo.Object{
	"e":                      &tengo.Float{Value: math.E},
	"pi":                     &tengo.Float{Value: math.Pi},
	"phi":                    &tengo.Float{Value: math.Phi},
	"sqrt2":                  &tengo.Float{Value: math.Sqrt2},
	"sqrtE":                  &tengo.Float{Value: math.SqrtE},
	"sqrtPi":                 &tengo.Float{Value: math.SqrtPi},
	"sqrtPhi":                &tengo.Float{Value: math.SqrtPhi},
	"ln2":                    &tengo.Float{Value: math.Ln2},
	"log2E":                  &tengo.Float{Value: math.Log2E},
	"ln10":                   &tengo.Float{Value: math.Ln10},
	"log10E":                 &tengo.Float{Value: math.Log10E},
	"maxFloat32":             &tengo.Float{Value: math.MaxFloat32},
	"smallestNonzeroFloat32": &tengo.Float{Value: math.SmallestNonzeroFloat32},
	"maxFloat64":             &tengo.Float{Value: math.MaxFloat64},
	"smallestNonzeroFloat64": &tengo.Float{Value: math.SmallestNonzeroFloat64},
	"maxInt":                 &tengo.Int{Value: math.MaxInt},
	"minInt":                 &tengo.Int{Value: math.MinInt},
	"maxInt8":                &tengo.Int{Value: math.MaxInt8},
	"minInt8":                &tengo.Int{Value: math.MinInt8},
	"maxInt16":               &tengo.Int{Value: math.MaxInt16},
	"minInt16":               &tengo.Int{Value: math.MinInt16},
	"maxInt32":               &tengo.Int{Value: math.MaxInt32},
	"minInt32":               &tengo.Int{Value: math.MinInt32},
	"maxInt64":               &tengo.Int{Value: math.MaxInt64},
	"minInt64":               &tengo.Int{Value: math.MinInt64},
	"abs": &tengo.UserFunction{
		Name:  "abs",
		Value: FuncAFRF(math.Abs),
	},
	"acos": &tengo.UserFunction{
		Name:  "acos",
		Value: FuncAFRF(math.Acos),
	},
	"acosh": &tengo.UserFunction{
		Name:  "acosh",
		Value: FuncAFRF(math.Acosh),
	},
	"asin": &tengo.UserFunction{
		Name:  "asin",
		Value: FuncAFRF(math.Asin),
	},
	"asinh": &tengo.UserFunction{
		Name:  "asinh",
		Value: FuncAFRF(math.Asinh),
	},
	"atan": &tengo.UserFunction{
		Name:  "atan",
		Value: FuncAFRF(math.Atan),
	},
	"atan2": &tengo.UserFunction{
		Name:  "atan2",
		Value: FuncAFFRF(math.Atan2),
	},
	"atanh": &tengo.UserFunction{
		Name:  "atanh",
		Value: FuncAFRF(math.Atanh),
	},
	"cbrt": &tengo.UserFunction{
		Name:  "cbrt",
		Value: FuncAFRF(math.Cbrt),
	},
	"ceil": &tengo.UserFunction{
		Name:  "ceil",
		Value: FuncAFRF(math.Ceil),
	},
	"copysign": &tengo.UserFunction{
		Name:  "copysign",
		Value: FuncAFFRF(math.Copysign),
	},
	"cos": &tengo.UserFunction{
		Name:  "cos",
		Value: FuncAFRF(math.Cos),
	},
	"cosh": &tengo.UserFunction{
		Name:  "cosh",
		Value: FuncAFRF(math.Cosh),
	},
	"dim": &tengo.UserFunction{
		Name:  "dim",
		Value: FuncAFFRF(math.Dim),
	},
	"erf": &tengo.UserFunction{
		Name:  "erf",
		Value: FuncAFRF(math.Erf),
	},
	"erfc": &tengo.UserFunction{
		Name:  "erfc",
		Value: FuncAFRF(math.Erfc),
	},
	"exp": &tengo.UserFunction{
		Name:  "exp",
		Value: FuncAFRF(math.Exp),
	},
	"exp2": &tengo.UserFunction{
		Name:  "exp2",
		Value: FuncAFRF(math.Exp2),
	},
	"expm1": &tengo.UserFunction{
		Name:  "expm1",
		Value: FuncAFRF(math.Expm1),
	},
	"floor": &tengo.UserFunction{
		Name:  "floor",
		Value: FuncAFRF(math.Floor),
	},
	"gamma": &tengo.UserFunction{
		Name:  "gamma",
		Value: FuncAFRF(math.Gamma),
	},
	"hypot": &tengo.UserFunction{
		Name:  "hypot",
		Value: FuncAFFRF(math.Hypot),
	},
	"ilogb": &tengo.UserFunction{
		Name:  "ilogb",
		Value: FuncAFRI(math.Ilogb),
	},
	"inf": &tengo.UserFunction{
		Name:  "inf",
		Value: FuncAIRF(math.Inf),
	},
	"is_inf": &tengo.UserFunction{
		Name:  "is_inf",
		Value: FuncAFIRB(math.IsInf),
	},
	"is_nan": &tengo.UserFunction{
		Name:  "is_nan",
		Value: FuncAFRB(math.IsNaN),
	},
	"j0": &tengo.UserFunction{
		Name:  "j0",
		Value: FuncAFRF(math.J0),
	},
	"j1": &tengo.UserFunction{
		Name:  "j1",
		Value: FuncAFRF(math.J1),
	},
	"jn": &tengo.UserFunction{
		Name:  "jn",
		Value: FuncAIFRF(math.Jn),
	},
	"ldexp": &tengo.UserFunction{
		Name:  "ldexp",
		Value: FuncAFIRF(math.Ldexp),
	},
	"log": &tengo.UserFunction{
		Name:  "log",
		Value: FuncAFRF(math.Log),
	},
	"log10": &tengo.UserFunction{
		Name:  "log10",
		Value: FuncAFRF(math.Log10),
	},
	"log1p": &tengo.UserFunction{
		Name:  "log1p",
		Value: FuncAFRF(math.Log1p),
	},
	"log2": &tengo.UserFunction{
		Name:  "log2",
		Value: FuncAFRF(math.Log2),
	},
	"logb": &tengo.UserFunction{
		Name:  "logb",
		Value: FuncAFRF(math.Logb),
	},
	"max": &tengo.UserFunction{
		Name:  "max",
		Value: FuncAFFRF(math.Max),
	},
	"min": &tengo.UserFunction{
		Name:  "min",
		Value: FuncAFFRF(math.Min),
	},
	"mod": &tengo.UserFunction{
		Name:  "mod",
		Value: FuncAFFRF(math.Mod),
	},
	"nan": &tengo.UserFunction{
		Name:  "nan",
		Value: FuncARF(math.NaN),
	},
	"nextafter": &tengo.UserFunction{
		Name:  "nextafter",
		Value: FuncAFFRF(math.Nextafter),
	},
	"pow": &tengo.UserFunction{
		Name:  "pow",
		Value: FuncAFFRF(math.Pow),
	},
	"pow10": &tengo.UserFunction{
		Name:  "pow10",
		Value: FuncAIRF(math.Pow10),
	},
	"remainder": &tengo.UserFunction{
		Name:  "remainder",
		Value: FuncAFFRF(math.Remainder),
	},
	"signbit": &tengo.UserFunction{
		Name:  "signbit",
		Value: FuncAFRB(math.Signbit),
	},
	"sin": &tengo.UserFunction{
		Name:  "sin",
		Value: FuncAFRF(math.Sin),
	},
	"sinh": &tengo.UserFunction{
		Name:  "sinh",
		Value: FuncAFRF(math.Sinh),
	},
	"sqrt": &tengo.UserFunction{
		Name:  "sqrt",
		Value: FuncAFRF(math.Sqrt),
	},
	"tan": &tengo.UserFunction{
		Name:  "tan",
		Value: FuncAFRF(math.Tan),
	},
	"tanh": &tengo.UserFunction{
		Name:  "tanh",
		Value: FuncAFRF(math.Tanh),
	},
	"trunc": &tengo.UserFunction{
		Name:  "trunc",
		Value: FuncAFRF(math.Trunc),
	},
	"y0": &tengo.UserFunction{
		Name:  "y0",
		Value: FuncAFRF(math.Y0),
	},
	"y1": &tengo.UserFunction{
		Name:  "y1",
		Value: FuncAFRF(math.Y1),
	},
	"yn": &tengo.UserFunction{
		Name:  "yn",
		Value: FuncAIFRF(math.Yn),
	},
}
