using System;
using System.Collections.Specialized;
using System.Globalization;
using Telerik.Sitefinity.Ecommerce.Payment.Model;
using Telerik.Sitefinity.Modules.Ecommerce.ExchangeRates.Implementations;
using Telerik.Sitefinity.Modules.Ecommerce.Orders;
using Telerik.Sitefinity.Modules.Ecommerce.Payment.Processors;

namespace SitefinityWebApp
{
    public class MultiCurrencyPayPalStandardProvider : PayPalStandardProvider
    {
        protected override NameValueCollection GetPostValues(IPaymentRequest data)
        {
            var baseValues = base.GetPostValues(data);

            PriceConverterHelper.SetPostValues("amount_", baseValues, data);

            return baseValues;
        }
    }

    public class MultiCurrencyWorldPayProvider : WorldPayProvider
    {
        protected override NameValueCollection GetPostValues(IPaymentRequest data)
        {
            var baseValues = base.GetPostValues(data);

            PriceConverterHelper.SetPostValues("cost", baseValues, data);

            return baseValues;
        }
    }

    internal class PriceConverterHelper
    {
        internal static void SetPostValues(string key, NameValueCollection baseValues, IPaymentRequest data)
        {
            NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;

            nfi.NumberGroupSeparator = "";

            var order = OrdersManager.GetManager().GetOrder(data.OrderID);

            if (order != null)
            {
                int itemNumber = 0;
                for (int i = 0; i < order.Details.Count; i++)
                {
                    itemNumber = i + 1;

                    if (order.DefaultCurrency != order.Currency)
                    {
                        var exchangedPrice = ConvertAndRoundPrice(order.Details[i].Price);

                        baseValues[key + itemNumber] = exchangedPrice.ToString("N2", nfi);
                    }
                }
            }
        }

        private static decimal ConvertAndRoundPrice(decimal amount)
        {
            return Math.Round(new EcommerceExchangeRateConverter().ConvertPrice(amount), 2, MidpointRounding.AwayFromZero);
        }
    }
}