using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using XKRS.Common.Interface;

namespace XKRS.UI.Model.Winform.Helper
{
    public static class MenuFormFactory
    {

        public static Dictionary<MenuNodeAttribute, Type> menuFrmTypeDict = null;
        public static Dictionary<MenuNodeAttribute,Type> MenuFrmTypeDict
        {
            get
            {
                if (menuFrmTypeDict == null)
                {
                    var assm = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory)
                        .GetFiles("*.dll")
                        .Where(fi =>
                        {
                            return fi.Name.StartsWith("XKRS");
                        })
                        .Select(u =>
                        {
                            try
                            {
                                return Assembly.LoadFrom(u.FullName);
                            }
                            catch { }
                            return null;
                        })
                        .Where(a => a != null)
                        .ToList();
                    assm.AddRange(AppDomain.CurrentDomain.GetAssemblies());
                    assm = assm.Distinct().ToList();

                    try
                    {
                        menuFrmTypeDict = assm.SelectMany(a => a.GetTypes())
                            .Where(t =>
                            {
                                if (t.GetInterfaces().Contains(typeof(IMenuNode)))
                                {
                                    var attr = t.GetCustomAttribute<MenuNodeAttribute>();
                                    return attr != null;
                                }
                                else
                                {
                                    return false;
                                }
                            }).ToDictionary(t => t.GetCustomAttribute<MenuNodeAttribute>(), t => t);
                    }
                    catch(Exception ex)
                    {
                        throw ex;
                    }
                }
                return menuFrmTypeDict;
            }
        }
        /// <summary>
        /// 从Menu配置项转为窗口
        /// </summary>
        /// <param name="frmCode"></param>
        /// <returns></returns>
        public static MenuFormBase GetMenuFrm(string frmCode)
        {
            Type frmType = GetMenuFrmType(frmCode);
            if (frmType == null)
            {
                return null;
            }
            var menuItem = Activator.CreateInstance(frmType);
            if (menuItem == null)
            {
                return null;
            }
            var menu = menuItem as MenuFormBase;
            if (menu == null)
            {
                return null;
            }
            menu.Tag = frmCode;
            return menu;
        }

        public static Type GetMenuFrmType(string frmCode)
        {
            Type frmType = null;
            foreach (KeyValuePair<MenuNodeAttribute,Type> pair in MenuFrmTypeDict)
            {
                if (pair.Key.MenuCode == frmCode)
                {
                    frmType = pair.Value;
                    break;
                }
            }
            return frmType;
        }
    }
}
