using Jint.Native;

namespace Jint.Runtime.Interpreter.Expressions
{
    internal sealed class JintSequenceExpression : JintExpression
    {
        private JintExpression[] _expressions = Array.Empty<JintExpression>();
        private bool _initialized;

        public JintSequenceExpression(SequenceExpression expression) : base(expression)
        {
        }

        private void Initialize()
        {
            var expression = (SequenceExpression) _expression;
            ref readonly var expressions = ref expression.Expressions;
            var temp = new JintExpression[expressions.Count];
            for (var i = 0; i < (uint) temp.Length; i++)
            {
                temp[i] = Build(expressions[i]);
            }

            _expressions = temp;
        }

        protected override object EvaluateInternal(EvaluationContext context)
        {
            if (!_initialized)
            {
                Initialize();
                _initialized = true;
            }
            
            var result = JsValue.Undefined;
            foreach (var expression in _expressions)
            {
                result = expression.GetValue(context);
            }

            return result;
        }
    }
}
