namespace GPF.Build
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Reflection;
    using System.Text;
    using GPF.ServerObjects;

    internal class ClassScanner
    {
        private static void Main(string[] args)
        {
            SearchAssemblies();
        }

        private static void forceLoadGPFLib()
        {
            _ = typeof(ServerObject);
        }

        private static void SearchAssemblies()
        {
            forceLoadGPFLib();
            var totalClassList = new List<Type>();

            foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
            {
                totalClassList.AddRange(GetTypeList(a));
            }

            var sb = new StringBuilder();

            foreach (var t in totalClassList)
            {
                _ = sb.AppendLine(t.FullName);
            }

            File.WriteAllText("classes.txt", sb.ToString());
        }

        private static List<Type> GetTypeList(Assembly a)
        {
            var result = new List<Type>();
            foreach (var t in a.GetTypes())
            {
                if (t.IsAbstract || t.IsInterface)
                {
                    continue;
                }

                if (t.IsSubclassOf(typeof(ServerObject)) || t.IsSubclassOf(typeof(ServerObjectMessage)))
                {
                    result.Add(t);
                }
            }
            return result;
        }
    }
}
