using System;
using System.Threading.Tasks;

namespace Dapper.Tests.Performance
{
    // Note: VSTest injects an entry point in .NET Core land...so we have to split this out into
    // a separate project...so here we are.
    // See https://github.com/Microsoft/vstest/issues/636 for details
    public static class Program
    {
        public static void Main()
        {
#if DEBUG
            var fg = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Warning: DEBUG configuration; performance may be impacted");
            Console.ForegroundColor = fg;
            Console.WriteLine();
#endif
            Console.WriteLine("Using ConnectionString: " + PerformanceTests.ConnectionString);

            EnsureDBSetup();
            RunPerformanceTestsAsync().GetAwaiter().GetResult();
        }

        private static void EnsureDBSetup()
        {
            using (var cnn = PerformanceTests.GetOpenConnection())
            {
                var cmd = cnn.CreateCommand();
                cmd.CommandText = @"
if (OBJECT_ID('Posts') is null)
begin
	create table Posts
	(
		Id int identity primary key, 
		[Text] varchar(max) not null, 
		CreationDate datetime not null, 
		LastChangeDate datetime not null,
		Counter1 int,
		Counter2 int,
		Counter3 int,
		Counter4 int,
		Counter5 int,
		Counter6 int,
		Counter7 int,
		Counter8 int,
		Counter9 int
	)
	   
	set nocount on 

	declare @i int
	declare @c int

	declare @id int

	set @i = 0

	while @i <= 5001
	begin 
		
		insert Posts ([Text],CreationDate, LastChangeDate) values (replicate('x', 2000), GETDATE(), GETDATE())
		set @id = @@IDENTITY
		
		set @i = @i + 1
	end
end
";
                cmd.Connection = cnn;
                cmd.ExecuteNonQuery();
            }
        }

        private static async Task RunPerformanceTestsAsync()
        {
            var test = new PerformanceTests();
            const int iterations = 500;
            Console.WriteLine("Running {0} iterations that load up a post entity", iterations);
            await test.RunAsync(iterations).ConfigureAwait(false);
        }
    }
}
