package stdlib

import (
	"math"

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

var mathModule = map[string]objects.Object{
	"e":             &objects.Float{Value: math.E},
	"pi":            &objects.Float{Value: math.Pi},
	"phi":           &objects.Float{Value: math.Phi},
	"sqrt2":         &objects.Float{Value: math.Sqrt2},
	"sqrtE":         &objects.Float{Value: math.SqrtE},
	"sqrtPi":        &objects.Float{Value: math.SqrtPi},
	"sqrtPhi":       &objects.Float{Value: math.SqrtPhi},
	"ln2":           &objects.Float{Value: math.Ln2},
	"log2E":         &objects.Float{Value: math.Log2E},
	"ln10":          &objects.Float{Value: math.Ln10},
	"log10E":        &objects.Float{Value: math.Log10E},
	"abs":           FuncAFRF(math.Abs),
	"acos":          FuncAFRF(math.Acos),
	"acosh":         FuncAFRF(math.Acosh),
	"asin":          FuncAFRF(math.Asin),
	"asinh":         FuncAFRF(math.Asinh),
	"atan":          FuncAFRF(math.Atan),
	"atan2":         FuncAFFRF(math.Atan2),
	"atanh":         FuncAFRF(math.Atanh),
	"cbrt":          FuncAFRF(math.Cbrt),
	"ceil":          FuncAFRF(math.Ceil),
	"copysign":      FuncAFFRF(math.Copysign),
	"cos":           FuncAFRF(math.Cos),
	"cosh":          FuncAFRF(math.Cosh),
	"dim":           FuncAFFRF(math.Dim),
	"erf":           FuncAFRF(math.Erf),
	"erfc":          FuncAFRF(math.Erfc),
	"erfcinv":       FuncAFRF(math.Erfcinv),
	"erfinv":        FuncAFRF(math.Erfinv),
	"exp":           FuncAFRF(math.Exp),
	"exp2":          FuncAFRF(math.Exp2),
	"expm1":         FuncAFRF(math.Expm1),
	"floor":         FuncAFRF(math.Floor),
	"gamma":         FuncAFRF(math.Gamma),
	"hypot":         FuncAFFRF(math.Hypot),
	"ilogb":         FuncAFRI(math.Ilogb),
	"inf":           FuncAIRF(math.Inf),
	"is_inf":        FuncAFIRB(math.IsInf),
	"is_nan":        FuncAFRB(math.IsNaN),
	"j0":            FuncAFRF(math.J0),
	"j1":            FuncAFRF(math.J1),
	"jn":            FuncAIFRF(math.Jn),
	"ldexp":         FuncAFIRF(math.Ldexp),
	"log":           FuncAFRF(math.Log),
	"log10":         FuncAFRF(math.Log10),
	"log1p":         FuncAFRF(math.Log1p),
	"log2":          FuncAFRF(math.Log2),
	"logb":          FuncAFRF(math.Logb),
	"max":           FuncAFFRF(math.Max),
	"min":           FuncAFFRF(math.Min),
	"mod":           FuncAFFRF(math.Mod),
	"nan":           FuncARF(math.NaN),
	"nextafter":     FuncAFFRF(math.Nextafter),
	"pow":           FuncAFFRF(math.Pow),
	"pow10":         FuncAIRF(math.Pow10),
	"remainder":     FuncAFFRF(math.Remainder),
	"round":         FuncAFRF(math.Round),
	"round_to_even": FuncAFRF(math.RoundToEven),
	"signbit":       FuncAFRB(math.Signbit),
	"sin":           FuncAFRF(math.Sin),
	"sinh":          FuncAFRF(math.Sinh),
	"sqrt":          FuncAFRF(math.Sqrt),
	"tan":           FuncAFRF(math.Tan),
	"tanh":          FuncAFRF(math.Tanh),
	"runct":         FuncAFRF(math.Trunc),
	"y0":            FuncAFRF(math.Y0),
	"y1":            FuncAFRF(math.Y1),
	"yn":            FuncAIFRF(math.Yn),
	// TODO: functions that have multiple returns
	// Should these be tuple assignment? Or Map return?
	//"frexp":  nil,
	//"lgamma": nil,
	//"modf":   nil,
	//"sincos": nil,
}