package math

import (
	"context"
	"math/rand"

	"github.com/MontFerret/ferret/pkg/runtime/core"
	"github.com/MontFerret/ferret/pkg/runtime/values"
)

// Rand return a pseudo-random number between 0 and 1.
// @param max (Float|Int, optional) - Upper limit.
// @param min (Float|Int, optional) - Lower limit.
// @returns (Float) - A number greater than 0 and less than 1.
func Rand(_ context.Context, args ...core.Value) (core.Value, error) {
	err := core.ValidateArgs(args, 0, 2)

	if err != nil {
		return values.None, err
	}

	if len(args) == 0 {
		return values.NewFloat(rand.Float64()), nil
	}

	var max float64
	var min float64

	max = float64(values.ToFloat(args[0]))

	if len(args) > 1 {
		min = float64(values.ToFloat(args[1]))
	} else {
		max, min = core.NumberBoundaries(max)
	}

	return values.NewFloat(core.Random(max, min)), nil
}
