// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using System.Globalization;
using Mages.Core;

namespace Microsoft.Plugin.Calculator
{
    public class CalculateEngine
    {
        private readonly Engine _magesEngine = new Engine();
        public const int RoundingDigits = 10;

        public CalculateResult Interpret(string input)
        {
            // Using CurrentCulture this is user facing
            return Interpret(input, CultureInfo.CurrentCulture);
        }

        public CalculateResult Interpret(string input, CultureInfo cultureInfo)
        {
            if (!CalculateHelper.InputValid(input))
            {
                return default;
            }

            var result = _magesEngine.Interpret(input);

            // This could happen for some incorrect queries, like pi(2)
            if (result == null)
            {
                return default;
            }

            result = TransformResult(result);

            if (string.IsNullOrEmpty(result?.ToString()))
            {
                return default;
            }

            var decimalResult = Convert.ToDecimal(result, cultureInfo);
            var roundedResult = Round(decimalResult);

            return new CalculateResult()
            {
                Result = decimalResult,
                RoundedResult = roundedResult,
            };
        }

        public static decimal Round(decimal value)
        {
            return Math.Round(value, RoundingDigits, MidpointRounding.AwayFromZero);
        }

        private static object TransformResult(object result)
        {
            if (result.ToString() == "NaN")
            {
                return Properties.Resources.wox_plugin_calculator_not_a_number;
            }

            if (result is Function)
            {
                return Properties.Resources.wox_plugin_calculator_expression_not_complete;
            }

            return result;
        }
    }
}
