﻿using System.Linq;
using adMoto.Payments.Core;
using adMoto.Payments.Core.Data;
using adMoto.Payments.Core.Interfaces;
using adMoto.Payments.Test.Fakes;
using adMoto.Payments.Web.Models;
using NUnit.Framework;

namespace adMoto.Payments.Test.Utils
{
    [TestFixture]
    public class PaymentUtilsTests
    {
        private readonly TestDataHelper _testDataHelper = new TestDataHelper();
        private readonly ITranslateManager _translateManager = new FakeTranslation();

        [Test, Sequential]
        [Category("Unit")]
        public void GetCurrency_Returns_Correct_Currency(
            [Values(null, "", "eur", "usd", "gbp", "GBP")] string input,
            [Values(PaymentsUtils.PLN, PaymentsUtils.PLN, PaymentsUtils.EUR, PaymentsUtils.USD, PaymentsUtils.GBP, PaymentsUtils.GBP)] string output
            )
        {
            //Arrange
            var paymentsUtils = new PaymentsUtils();

            //Act
            var result = paymentsUtils.GetCurrency(input);

            //Assert
            Assert.That(result, Is.EqualTo(output));
        }

        [Test]
        [Category("Unit")]
        public void CreateAndAddNewPayment_Creates_PlatnosciEcard()
        {
            //Arrange
            var idFaktury = 123;
            var repPayment = new Repository<PlatnosciEcard>(new FakeDataContext());
            var paymentsUtils = new PaymentsUtils(repPayment, _translateManager);
            var invoice = _testDataHelper.CreateInvoice(idFaktury, "nip", "abc/2009", 200, 2);
            var payer = _testDataHelper.CreatePayer(idFaktury, "test", "test");
            var waluta = new Waluta { Amount = 200, Currency = PaymentsUtils.PLN };

            //Act
            paymentsUtils.CreateAndAddNewPyment(invoice, waluta, payer, "sessionId");
            var payment = repPayment.Find(p => p.IDFaktury == 123).SingleOrDefault();

            //Act
            Assert.That(payment.AMOUNT, Is.EqualTo(200));
        }

        [Test, Sequential]
        [Category("Unit")]
        public void BruttoToString_Returns_Correct_Amount(
            [Values(null, "", "pln", "PLN", "GBP", "gbp", "xx")] string input,
            [Values("100 PLN ", "100 PLN ", "100 PLN ", "100 PLN ", "100 PLN (1 GBP)", "100 PLN (1 GBP)", "100 PLN (1 XX)")] string output
            )
        {
            //Arrange
            var paymentUtils = new PaymentsUtils();

            //Act
            var result = paymentUtils.BruttoToString(100, 1, input);

            //Act
            System.Diagnostics.Debug.WriteLine(result);
            Assert.That(result, Is.EqualTo(output));
        }
        
    }
}