using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

using glue.Debugging;

using agree;


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
///
///
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class MainClass
{

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///
	///
	///
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	static void Main(string[] args)
	{
		for (int i = 0; i < args.Length; i++)
			if (args[i].StartsWith("--"))
				args[i] = args[i].Substring(1);

		bool f_verbose = args.Contains("-v");
		if (f_verbose)
			args = args.Where(e => e != "-v").ToArray();

		if (args.Contains("-help") || args.Contains("-?"))
		{
			Console.WriteLine(helpmsg);
			return;
		}

		String filename = args.FirstOrDefault(e => e[0] != '-');
		if (filename == null)
		{
			Console.WriteLine(helpmsg);
			return;
		}

		SysObj so = SysObj.Instance;

		Grammar g;
		using (TimingReport trx = new TimingReport(Console.Out, "Processing script file"))
			g = new SysCommands.CmdTokLoadGrammar(so, Path.GetFileNameWithoutExtension(filename), filename).Task.Result;


		//using (TimingReport tr = new TimingReport(Console.Out, "Load types"))
		//    TypeMgr.LoadTypes(tdlg.fd);

		//using (TimingReport tr = new TimingReport(Console.Out, "Check for cycle"))
		//    TypeMgr.CheckForCycle();

		//using (TimingReport tr = new TimingReport(Console.Out, "Edge count"))
		//    Console.WriteLine(TypeMgr.EdgeCount());

		//using (TimingReport tr = new TimingReport(Console.Out, "Checking for redundant links"))
		//    TypeMgr.CheckRedundantLinks();

		//using (TimingReport tr = new TimingReport(Console.Out, String.Format("computing closure for {0} user-defined types...", TypeMgr.type_dict.Count)))
		//    TypeMgr.EmbedBcpo();

		//using (TimingReport tr = new TimingReport(Console.Out, "Checking bit codes"))
		//    TypeMgr.CheckConjoinedParents(null);

		//using (TimingReport tr = new TimingReport(Console.Out, "Checking for redundant links"))
		//    TypeMgr.CheckForCycle();

		//using (TimingReport tr = new TimingReport(Console.Out, "Check GLBs"))
		//    TfsTypeMgr.CheckGlb();

		//using (TimingReport tr = new TimingReport(Console.Out, "Edge count"))
		//    Console.WriteLine(TypeMgr.EdgeCount());

		//using (TimingReport tr = new TimingReport(Console.Out, "Load features"))
		//    TypeMgr.LoadFeatures();

		//using (TimingReport tr = new TimingReport(Console.Out, "Resolve special types"))
		//    TypeMgr.ResolveSpecialTypes();

		//using (TimingReport tr = new TimingReport(Console.Out, "Check for unused GLBs"))
		//    TypeMgr.CheckForUnusedGlbs();

		//using (TimingReport tr = new TimingReport(Console.Out, "Checking feature flags"))
		//    TfsTypeMgr.CheckFeaturesFlag();

		//using (TimingReport tr = new TimingReport(Console.Out, "Load type definitions"))
		//    g.LoadTypeDefinitions();


		//using (TimingReport tr = new TimingReport(Console.Out, "Make type definitions well-formed"))
			//g.ExpandTypeDefinitions();

#if false
			using (TimingReport tr = new TimingReport(Console.Out, "Checking for orphaned edges"))
				TypeMgr.CheckOrphanedEdges(Console.Out);

			using (TimingReport tr = new TimingReport(Console.Out, "GLB algs"))
				TypeMgr.CheckGlbAlgs();


			TfsTypeMgr.DisplayTree(true);
#endif

		Console.WriteLine("Number of bare types: {0}", g.tm.AllTypes.Count(t => t.IsBare));
		Tray tr = g.loadtray;
		int c_bare_use = 0;
		foreach (ConstraintPool cp in tr.Pools)
		{
			Console.WriteLine("{0} : {1} edges", cp.Feature.ToUpper(), cp.Count);
			foreach (var grp in cp.Edges.Where(e => tr.tm.GetEdgeType(e.FlagsId).IsBare && !e.IsCoreferenced)
									.GroupBy(e => tr.tm.GetEdgeType(e.FlagsId)))
			{
				Console.WriteLine("\t{0} : {1}", grp.Key.ToString(), grp.Count());
				c_bare_use += grp.Count();
			}
		}
		Console.WriteLine("Total bare edges (includes garbage): {0}", c_bare_use);


		if (Debugger.IsAttached)
		{
			Console.WriteLine("done! press <enter> to exit");
			Console.ReadLine();
		}

		Environment.Exit(0);
	}

	static String helpmsg =
@"usage:

example:
	tgcs-test filename
";

};