using System;
using System.Configuration;
using TechBot.Library;

namespace TechBot.Console
{
	public class ConsoleServiceOutput : IServiceOutput
	{
		public void WriteLine(MessageContext context,
		                      string message)
		{
			System.Console.WriteLine(message);
		}
	}

	
	class MainClass
	{
		private static void VerifyRequiredOption(string optionName,
		                                         string optionValue)
		{
			if (optionValue == null)
			{
				throw new Exception(String.Format("Option '{0}' not set.",
				                                  optionName));
			}
		}
		
		private static string IRCServerHostName
		{
			get
			{
				string optionName = "IRCServerHostName";
				string s = ConfigurationSettings.AppSettings[optionName];
				VerifyRequiredOption(optionName,
				                     s);
				return s;
			}
		}

		private static int IRCServerHostPort
		{
			get
			{
				string optionName = "IRCServerHostPort";
				string s = ConfigurationSettings.AppSettings[optionName];
				VerifyRequiredOption(optionName,
				                     s);
				return Int32.Parse(s);
			}
		}

		private static string IRCChannelNames
		{
			get
			{
				string optionName = "IRCChannelNames";
				string s = ConfigurationSettings.AppSettings[optionName];
				VerifyRequiredOption(optionName,
				                     s);
				return s;
			}
		}

		private static string IRCBotName
		{
			get
			{
				string optionName = "IRCBotName";
				string s = ConfigurationSettings.AppSettings[optionName];
				VerifyRequiredOption(optionName,
				                     s);
				return s;
			}
		}

		private static string ChmPath
		{
			get
			{
				string optionName = "ChmPath";
				string s = ConfigurationSettings.AppSettings[optionName];
				VerifyRequiredOption(optionName,
				                     s);
				return s;
			}
		}
		
		private static string MainChm
		{
			get
			{
				string optionName = "MainChm";
				string s = ConfigurationSettings.AppSettings[optionName];
				VerifyRequiredOption(optionName,
				                     s);
				return s;
			}
		}

		private static string NtstatusXml
		{
			get
			{
				string optionName = "NtstatusXml";
				string s = ConfigurationSettings.AppSettings[optionName];
				VerifyRequiredOption(optionName,
				                     s);
				return s;
			}
		}

		private static string WinerrorXml
		{
			get
			{
				string optionName = "WinerrorXml";
				string s = ConfigurationSettings.AppSettings[optionName];
				VerifyRequiredOption(optionName,
				                     s);
				return s;
			}
		}

		private static string HresultXml
		{
			get
			{
				string optionName = "HresultXml";
				string s = ConfigurationSettings.AppSettings[optionName];
				VerifyRequiredOption(optionName,
				                     s);
				return s;
			}
		}

		private static string SvnCommand
		{
			get
			{
				string optionName = "SvnCommand";
				string s = ConfigurationSettings.AppSettings[optionName];
				VerifyRequiredOption(optionName,
				                     s);
				return s;
			}
		}

		private static void RunIrcService()
		{
			IrcService ircService = new IrcService(IRCServerHostName,
			                                       IRCServerHostPort,
			                                       IRCChannelNames,
			                                       IRCBotName,
			                                       ChmPath,
			                                       MainChm,
			                                       NtstatusXml,
			                                       WinerrorXml,
			                                       HresultXml,
			                                       SvnCommand);
			ircService.Run();
		}
		
		public static void Main(string[] args)
		{
			if (args.Length > 0 && args[0].ToLower().Equals("irc"))
			{
				RunIrcService();
				return;
			}
			
			System.Console.WriteLine("TechBot running console service...");
			TechBotService service = new TechBotService(new ConsoleServiceOutput(),
			                                            ChmPath,
			                                            MainChm,
			                                            NtstatusXml,
			                                            WinerrorXml,
			                                            HresultXml,
			                                            SvnCommand);
			service.Run();
			while (true)
			{
				string s = System.Console.ReadLine();
				service.InjectMessage(null,
				                      s);
			}
		}
	}
}