using System;
using System.IO;

namespace AMXXRelease
{
	//AMX Mod X core distribution
	public class CoreMod : AMod
	{
		public CoreMod()
		{
			AddModules();
			AddPlugins();
		}

		public override sealed string GetName()
		{
			return "base";
		}

		public override sealed string GetPluginDir()
		{
			return null;
		}

		public override sealed string GetBaseName()
		{
			return null;
		}

		//annoyingly complicated file exclusion filter
		public override sealed bool ExcludeCopy(string file)
		{
			if ( ((file.IndexOf(".so")!=-1) || (ABuilder.GetFileName(file).CompareTo("amxxpc")==0))
				&& (Releaser.IsWindows || Releaser.IsOSX) )
				return true;
			if ( ((file.IndexOf(".dylib")!=-1) || (ABuilder.GetFileName(file).CompareTo("amxxpc_osx")==0))
				&& (!Releaser.IsOSX) )
				return true;
			if ( (file.IndexOf(".sh")!=-1) && Releaser.IsWindows )
				return true;
			if ( ((file.IndexOf(".exe")!=-1) || (file.IndexOf(".dll")!=-1))
				&& (!Releaser.IsWindows) )
				return true;
			if (file.IndexOf("dlsym")!=-1)
				return true;
			if (ABuilder.GetFileName(file).CompareTo("svn_version.tpl") == 0)
			{
				return true;
			}

			return base.ExcludeCopy(file);
		}


		public override sealed bool CopyExtraFiles(ABuilder ab, string basedir, string source)
		{
			//Create directory structures
			string datadir = basedir + "\\data";

			if (!Directory.Exists(ABuilder.PropSlashes(datadir)))
				ab.CreateDir(ABuilder.PropSlashes(datadir));

			File.Copy(ABuilder.PropSlashes(source + "\\dlls\\geoip\\GeoIP.dat"),
					  ABuilder.PropSlashes(datadir + "\\GeoIP.dat"), 
					  true);

			ABuilder.CopyNormal(ab,
					ABuilder.PropSlashes(source + "\\plugins\\lang"), 
					ABuilder.PropSlashes(datadir + "\\lang")
					);

			if (!Directory.Exists(ABuilder.PropSlashes(basedir + "\\logs")))
				ab.CreateDir(ABuilder.PropSlashes(basedir + "\\logs"));

			ABuilder.CopyNormal(ab,
				ABuilder.PropSlashes(source + "\\plugins\\include"), 
				ABuilder.PropSlashes(basedir + "\\scripting\\include"));

			ABuilder.CopyNormal(ab,
				ABuilder.PropSlashes(source + "\\plugins\\include\\amxmod_compat"), 
				ABuilder.PropSlashes(basedir + "\\scripting\\include\\amxmod_compat"));

			ABuilder.CopyNormal(ab,
				ABuilder.PropSlashes(source + "\\plugins\\amxmod_compat"),
				ABuilder.PropSlashes(basedir + "\\scripting\\amxmod_compat"));

			ABuilder.CopyNormal(ab,
				ABuilder.PropSlashes(source + "\\plugins\\testsuite"),
				ABuilder.PropSlashes(basedir + "\\scripting\\testsuite"));

			return true;
		}

		private void AddPlugins()
		{
			AddPlugin("admin");

			Plugin admin_sql = new Plugin("admin_sql");
			admin_sql.source = "admin";
			admin_sql.options = "USING_SQL=1 -oadmin_sql.amx";
			m_Plugins.Add(admin_sql);

			Plugin bcompat = new Plugin("amxmod_compat");
			bcompat.source = "amxmod_compat/amxmod_compat";
			m_Plugins.Add(bcompat);

			AddPlugin("adminchat");
			AddPlugin("admincmd");
			AddPlugin("adminhelp");
			AddPlugin("adminslots");
			AddPlugin("adminvote");
			AddPlugin("antiflood");
			AddPlugin("imessage");
			AddPlugin("mapchooser");
			AddPlugin("mapsmenu");
			AddPlugin("menufront");
			AddPlugin("multilingual");
			AddPlugin("nextmap");
			AddPlugin("pausecfg");
			AddPlugin("plmenu");
			AddPlugin("scrollmsg");
			AddPlugin("statscfg");
			AddPlugin("telemenu");
			AddPlugin("timeleft");
			AddPlugin("cmdmenu");
			AddPlugin("pluginmenu");
		}

		private void AddModules()
		{
			Module core = new Module();

			core.sourcedir = "amxmodx";
			core.vcproj = "amxmodx_mm";
			core.build = "JITRelease";
			core.projname = "amxmodx_mm";
			core.outdir = "dlls";

			Module mysqlx = new Module("mysqlx");
			mysqlx.projname = "mysql_amxx";

			Module sqlitex = new Module("sqlite");
			Module engine = new Module("engine");
			Module fun = new Module("fun");
			Module geoip = new Module("geoip");
			Module fakemeta = new Module("fakemeta");
			Module sockets = new Module("sockets");
			Module regex = new Module("regex");
			Module nvault = new Module("nvault");
			Module sammich = new Module("hamsandwich");

			m_Modules.Add(core);
			m_Modules.Add(mysqlx);
			m_Modules.Add(engine);
			m_Modules.Add(fun);
			m_Modules.Add(geoip);
			m_Modules.Add(fakemeta);
			m_Modules.Add(sockets);
			m_Modules.Add(regex);
			m_Modules.Add(nvault);
			m_Modules.Add(sqlitex);
			m_Modules.Add(sammich);
		}
	}
}