using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.eShopWeb.FunctionalTests.Web;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Xunit;

namespace Microsoft.eShopWeb.FunctionalTests.WebRazorPages
{
    [Collection("Sequential")]
    public class BasketPageCheckout : IClassFixture<WebTestFixture>
    {
        public BasketPageCheckout(WebTestFixture factory)
        {
            Client = factory.CreateClient(new WebApplicationFactoryClientOptions
            {
                AllowAutoRedirect = true
            });
        }

        public HttpClient Client { get; }

        private string GetRequestVerificationToken(string input)
        {
            string regexpression = @"name=""__RequestVerificationToken"" type=""hidden"" value=""([-A-Za-z0-9+=/\\_]+?)""";
            var regex = new Regex(regexpression);
            var match = regex.Match(input);
            return match.Groups.Values.LastOrDefault().Value;
        }

        [Fact]
        public async Task RedirectsToLoginIfNotAuthenticated()
        {
            // Arrange & Act

            // Load Home Page
            var response = await Client.GetAsync("/");
            response.EnsureSuccessStatusCode();
            var stringResponse1 = await response.Content.ReadAsStringAsync();

            string token = GetRequestVerificationToken(stringResponse1);

            // Add Item to Cart
            var keyValues = new List<KeyValuePair<string, string>>();
            keyValues.Add(new KeyValuePair<string, string>("id", "2"));
            keyValues.Add(new KeyValuePair<string, string>("name", "shirt"));

            keyValues.Add(new KeyValuePair<string, string>("price", "19.49"));
            keyValues.Add(new KeyValuePair<string, string>("__RequestVerificationToken", token));

            var formContent = new FormUrlEncodedContent(keyValues);

            var postResponse = await Client.PostAsync("/basket/index", formContent);
            postResponse.EnsureSuccessStatusCode();
            var stringResponse = await postResponse.Content.ReadAsStringAsync();

            // Assert
            Assert.Contains(".NET Black &amp; White Mug", stringResponse);

            keyValues.Clear();
            keyValues.Add(new KeyValuePair<string, string>("__RequestVerificationToken", token));

            formContent = new FormUrlEncodedContent(keyValues);
            var postResponse2 = await Client.PostAsync("/Basket/Checkout", formContent);
            Assert.Contains("/Identity/Account/Login", postResponse2.RequestMessage.RequestUri.ToString());
        }
    }
}
