// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;

namespace Microsoft.DotNet.Tools.Test.Utilities
{
    public class NetworkHelper
    {
        // in milliseconds
        private const int Timeout = 50000;

        public static string Localhost { get; } = "http://localhost";

        public static bool IsServerUp(string url)
        {
            return SpinWait.SpinUntil(() =>
            {
                using (var client = new HttpClient())
                {
                    try
                    {
                        client.BaseAddress = new Uri(url);
                        HttpResponseMessage response = client.GetAsync("").Result;
                        return response.IsSuccessStatusCode;
                    }
                    catch (Exception)
                    {
                        Thread.Sleep(100);
                        return false;
                    }
                }
            }, Timeout);
        }

        public static void TestGetRequest(string url, string expectedResponse)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(url);

                HttpResponseMessage response = client.GetAsync("").Result;
                if (response.IsSuccessStatusCode)
                {
                    var responseString = response.Content.ReadAsStringAsync().Result;
                    responseString.Should().Contain(expectedResponse);
                }
            }
        }

        public static string GetLocalhostUrlWithFreePort()
        {
            return $"{Localhost}:{PortManager.GetPort()}/";
        }
    }
}
