using DevExpress.XtraBars;
using DevExpress.XtraBars.Ribbon;
using ProjectBase.Data.BaseDAL;
using ProjectBase.Data.Logs;
using SIASUN.Autopilot.BLL;
using SIASUN.Autopilot.Model;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SIASUN.Autopilot.View.RibbonPageHelper
{
    /// <summary>
    /// 动态创建RibbonPage和其下面的按钮项目辅助类
    /// </summary>
    public class RibbonPageHelper
    {
        //BlRoleRight bl = new BlRoleRight();

        private RibbonControl control;
        public FormMain mainForm;

        public RibbonPageHelper(FormMain mainForm, ref RibbonControl control)
        {
            this.mainForm = mainForm;
            this.control = control;
        }

        public void AddPages()
        {
            #region 初始化数据
            string condition = null;
            //BlMenuInfo menu = new BlMenuInfo();
            List<MoMenuInfo> moFirstList = null; // 一级标题
            condition = string.Format(" menu_winform_type = '1' AND menu_delete = 0");
            moFirstList = BLLFactory<BlMenuInfo>.Instance.Find(condition);

            #endregion
            int i = 0;
            foreach (MoMenuInfo firstInfo in moFirstList)
            {
                //如果没有菜单的权限，则跳过
                //if (!BLLFactory<BlRoleRight>.Instance.Function(SysEnvironment.CurrentLoginID, firstInfo.ID)) continue;

                //添加页面（一级菜单）
                RibbonPage page = new DevExpress.XtraBars.Ribbon.RibbonPage();
                page.Text = firstInfo.Name;
                page.Name = firstInfo.ID;
                this.control.Pages.Insert(i++, page);

                List<MoMenuInfo> moSecondList = null;// 二级标题
                condition = string.Format(" menu_winform_type = '2' AND menu_parent_id = '{0}' AND menu_delete = 0", firstInfo.ID);
                moSecondList = BLLFactory<BlMenuInfo>.Instance.Find(condition);
                if (moSecondList.Count == 0) continue;

                foreach (MoMenuInfo secondInfo in moSecondList)
                {
                    //如果没有菜单的权限，则跳过
                    //if (!BLLFactory<BlRoleRight>.Instance.Function(SysEnvironment.CurrentLoginID, secondInfo.ID)) continue;

                    //添加RibbonPageGroup（二级菜单）
                    if (!secondInfo.PID.Equals(firstInfo.ID))
                        continue;
                    RibbonPageGroup group = new RibbonPageGroup();
                    group.Text = secondInfo.Name;
                    group.Name = secondInfo.ID;
                    page.Groups.Add(group);

                    List<MoMenuInfo> moThirdList = null; // 三级标题
                    condition = string.Format(" menu_winform_type = '3' AND menu_parent_id = '{0}' AND menu_delete = 0", secondInfo.ID);
                    moThirdList = BLLFactory<BlMenuInfo>.Instance.Find(condition);
                    if (moThirdList.Count == 0) continue;
                    foreach (MoMenuInfo thirdInfo in moThirdList)
                    {
                        //如果没有菜单的权限，则跳过
                        //if (!BLLFactory<BlRoleRight>.Instance.Function(SysEnvironment.CurrentLoginID, thirdInfo.ID)) continue;

                        //添加功能按钮（三级菜单）
                        if (!thirdInfo.PID.Equals(secondInfo.ID))
                            continue;
                        BarButtonItem button = new BarButtonItem();
                        button.PaintStyle = BarItemPaintStyle.CaptionGlyph;
                        button.LargeGlyph = LoadIcon(thirdInfo.Icon);
                        button.Glyph = LoadIcon(thirdInfo.Icon);

                        button.Name = thirdInfo.ID;
                        button.Caption = thirdInfo.Name;
                        button.Tag = thirdInfo.Url;
                        button.ItemClick += (sender, e) =>
                        {
                            if (button.Tag != null && !string.IsNullOrEmpty(button.Tag.ToString()))
                            {
                                Type type = Type.GetType(button.Tag.ToString());
                                LoadMdiForm(mainForm, type);
                            }
                            //else
                            //{
                            //    //MessageDxUtil.ShowTips(button.Caption);
                            //}
                        };
                        group.ItemLinks.Add(button);
                    }
                }
            }
        }

        /// <summary>
        /// 加载图标，如果加载不成功，那么使用默认图标
        /// </summary>
        /// <param name="iconPath"></param>
        /// <returns></returns>
        private Image LoadIcon(string iconPath)
        {
            string filePath = Application.StartupPath + "\\Images\\100.ico";
            Icon icon = Icon.ExtractAssociatedIcon(filePath);
            Image result = icon.ToBitmap();
            try
            {
                if (!string.IsNullOrEmpty(iconPath))
                {
                    string path = Application.StartupPath + iconPath;
                    if (File.Exists(path))
                    {
                        result = Image.FromFile(path);
                    }
                }
            }
            catch
            {

                LogHelper.log.Error(string.Format("无法识别图标地址：{0}，请确保该文件存在！", iconPath));
            }

            return result;
        }

        /// <summary>
        /// 加载插件窗体
        /// </summary>
        private void LoadPlugInForm(string typeName)
        {
            try
            {
                string[] itemArray = typeName.Split(new char[] { ',', ';' });

                string type = itemArray[0].Trim();
                string filePath = itemArray[1].Trim();//必须是相对路径

                //判断是否配置了显示模式，默认窗体为Show非模式显示
                string showDialog = (itemArray.Length > 2) ? itemArray[2].ToLower() : "";
                bool isShowDialog = (showDialog == "1") || (showDialog == "dialog");

                string dllFullPath = Path.Combine(Application.StartupPath, filePath);
                Assembly tempAssembly = System.Reflection.Assembly.LoadFrom(dllFullPath);
                if (tempAssembly != null)
                {
                    Type objType = tempAssembly.GetType(type);
                    if (objType != null)
                    {
                        //LoadMdiForm(this.mainForm, objType, isShowDialog);
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.log.Error(string.Format("加载模块【{0}】失败，请检查书写是否正确。", typeName), ex);
            }
        }

        /// <summary>
        /// 唯一加载某个类型的窗体，如果存在则显示，否则创建。
        /// </summary>
        /// <param name="mainDialog">主窗体对象</param>
        /// <param name="formType">待显示的窗体类型</param>
        /// <returns></returns>

        public static Form LoadMdiForm(Form mainDialog, Type formType)
        {
            bool bFound = false;
            Form tableForm = null;
            foreach (Form form in mainDialog.MdiChildren)
            {
                if (form.GetType() == formType)
                {
                    bFound = true;
                    tableForm = form;
                    break;
                }
            }
            if (!bFound)
            {
                tableForm = (Form)Activator.CreateInstance(formType);
                tableForm.MdiParent = mainDialog;
                tableForm.Show();
            }

            //tableForm.Dock = DockStyle.Fill;
            //tableForm.WindowState = FormWindowState.Maximized;
            tableForm.BringToFront();
            tableForm.Activate();

            return tableForm;
        }
    }
}
