using System;
using System.IO;
using System.Diagnostics;

namespace builder
{
	public class Win32Builder : ABuilder
	{
		public Win32Builder(Config _cfg)
		{
			cfg = _cfg;
		}

		public override string GetPawnCompilerName()
		{
			return "spcomp.exe";
		}

		public override bool BuildLibrary(Package pkg, Library lib)
		{
			ProcessStartInfo info = new ProcessStartInfo();

			string path = Config.PathFormat("{0}/{1}/msvc9", 
				cfg.source_path,
				lib.source_path);

			/* PlatformExt ignored for us */
			string binName = lib.binary_name + (lib.is_executable ? ".exe" : ".dll");

			string config_name = "Unknown";

			if (lib.release_mode == ReleaseMode.ReleaseMode_Release)
			{
				config_name = "Release";
			}
			else if (lib.release_mode == ReleaseMode.ReleaseMode_Debug)
			{
				config_name = "Debug";
			}

			if (lib.build_mode == BuildMode.BuildMode_Episode1)
			{
				config_name = config_name + " - Episode 1";
			}
			else if (lib.build_mode == BuildMode.BuildMode_Episode2)
			{
				config_name = config_name + " - Orange Box";
			}
			else if (lib.build_mode == BuildMode.BuildMode_OldMetamod)
			{
				config_name = config_name + " - Old Metamod";
			}
			else if (lib.build_mode == BuildMode.BuildMode_Left4Dead)
			{
			config_name = config_name + " - Left 4 Dead";
			}

			string binpath = Config.PathFormat("{0}/{1}/{2}",
				path,
				config_name,
				binName);
			
			if (File.Exists(binpath))
			{
				File.Delete(binpath);
			}

			string project_file = null;
			if (lib.vcproj_name != null)
			{
				project_file = lib.vcproj_name + ".vcproj";
			} 
			else 
			{
				project_file = lib.binary_name + ".vcproj";
			}

			info.WorkingDirectory = path;
			info.FileName = cfg.builder_path;
			info.UseShellExecute = false;
			info.RedirectStandardOutput = true;
			info.RedirectStandardError = true;

			if (cfg.build_options != null)
			{
				info.Arguments = cfg.build_options + " ";
			}

			info.Arguments += "/rebuild \"" + project_file + "\" \"" + config_name + "\"";

			Process p = Process.Start(info);
			Console.WriteLine(p.StandardOutput.ReadToEnd());
			p.WaitForExit();
			p.Close();

			if (!File.Exists(binpath))
			{
				return false;
			}

			path = Config.PathFormat("{0}/{1}/{2}/{3}",
				cfg.pkg_path,
				pkg.GetBaseFolder(),
				lib.package_path,
				binName);
			File.Copy(binpath, path, true);

			/* On Windows we optionally log the PDB path */
			if (!lib.is_executable && cfg.pdb_log_file != null)
			{
				FileStream fs = File.Open(cfg.pdb_log_file, FileMode.Append, FileAccess.Write);
				StreamWriter sw = new StreamWriter(fs);
				sw.WriteLine(binpath.Replace(".dll", ".pdb"));
				sw.Close();
			}

			return true;
		}
	}
}
