using System;
using System.Text;
using System.Diagnostics;

namespace NPanday.Test.Issue67.Runner
{
	public class TestRunner
	{
		public TestRunner()
		{
		}

		[STAThread]
		static void Main(string[] args)
		{
		    Console.WriteLine("-----Starting Test Runner-----");
			Console.WriteLine(@flattenArgs(args));
			String vendor = GetArgFor("vendor", args);
			String startProcessAssembly = @GetArgFor("startProcessAssembly", args);
			ProcessStartInfo processStartInfo = null;

			if(vendor != null && vendor.Equals("MONO"))
			{
                processStartInfo =
                    new ProcessStartInfo("mono", startProcessAssembly + " " + @flattenArgs(args));
            }
            else
            {
                processStartInfo =
                    new ProcessStartInfo(startProcessAssembly, @flattenArgs(args));
            }

			processStartInfo.EnvironmentVariables["APPDOMAIN_MANAGER_ASM"]
				= "NPanday.Test.Issue67.Domain, Version=0.0.0.0, PublicKeyToken=4b435f4d76e2f0e6, culture=neutral";
			processStartInfo.EnvironmentVariables["APPDOMAIN_MANAGER_TYPE"]
				= "NPanday.Test.Issue67.Domain.TestAppDomainManager";

			processStartInfo.UseShellExecute = false;
			Process.Start(processStartInfo);
            Console.WriteLine("-----Ending Test Runner-----");
		}

		private static string GetArgFor(string name, string[] args)
		{
			char[] delim = {'='};
			foreach(string arg in args)
			{
                string[] tokens = arg.Split(delim);
                if (tokens[0].Equals(name)) return tokens[1];
			}
            return null;
		}

		private static string flattenArgs(string[] args)
		{
			StringBuilder stringBuilder = new StringBuilder();
			foreach(string arg in args)
			{
				stringBuilder.Append(@"""").Append(@arg).Append(@"""").Append(" ");
			}
			return stringBuilder.ToString();
		}
	}
}
