using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BLL;

namespace FineUIPro.Web.common.ProjectSet
{
    public partial class ProjectRolePower : PageBase
    {
        /// <summary>
        /// 角色主键
        /// </summary>
        public string RoleId
        {
            get
            {
                return (string)ViewState["RoleId"];
            }
            set
            {
                ViewState["RoleId"] = value;
            }
        }

        /// <summary>
        /// 项目主键
        /// </summary>
        public string ProjectId
        {
            get
            {
                return (string)ViewState["ProjectId"];
            }
            set
            {
                ViewState["ProjectId"] = value;
            }
        }

        /// <summary>
        /// 菜单模块
        /// </summary>
        public string MenuModuleId
        {
            get
            {
                return (string)ViewState["MenuModuleId"];
            }
            set
            {
                ViewState["MenuModuleId"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ////加载角色树
                this.InitRoleTree();
                ///加载菜单树
                this.InitTreeProjectSystem();
                this.InitMenuTree();
            }
        }

        #region 加载项目系统树
        /// <summary>
        /// 加载项目系统树
        /// </summary>
        private void InitTreeProjectSystem()
        {
            this.tvProjectSystem.Nodes.Clear();
            TreeNode rootNode = new TreeNode();
            rootNode.Text = "项目系统";
            rootNode.NodeID = "0";
            rootNode.Expanded = true;
            this.tvProjectSystem.Nodes.Add(rootNode);
            BoundProjectSystemTree(rootNode.Nodes);
        }

        /// <summary>
        /// 添加项目
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="parentId"></param>
        /// <param name="type"></param>
        private void BoundProjectSystemTree(TreeNodeCollection nodes)
        {
            List<Model.Base_Project> projectLists = (from x in Funs.DB.Base_Project select x).ToList();
            if (projectLists.Count() > 0)
            {
                TreeNode tn = null;
                foreach (var q in projectLists)
                {
                    tn = new TreeNode();
                    tn.Text = q.ProjectName;
                    tn.NodeID = q.ProjectId;
                    nodes.Add(tn);

                    var systems = BLL.CommonService.GetIsMoreProjectSystemList();
                    TreeNode s = null;
                    foreach (var sys in systems)
                    {
                        s = new TreeNode();
                        s.Text = sys.Text;
                        s.NodeID = sys.Value + "|" + q.ProjectId;
                        s.EnableClickEvent = true;
                        tn.Nodes.Add(s);
                    }
                }

            }
        }

        #endregion

        #region 初始化角色树
        /// <summary>
        /// 初始化树
        /// </summary>
        private void InitRoleTree()
        {
            this.tvRole.Nodes.Clear();

            TreeNode rootNode = new TreeNode();//定义根节点
            rootNode.Text = "角色";
            rootNode.NodeID = "0";
            rootNode.Expanded = true;
            this.tvRole.Nodes.Add(rootNode);

            var role = from x in BLL.Funs.DB.Sys_Role orderby x.RoleName select x;
            foreach (var q in role)
            {
                TreeNode roleNode = new TreeNode();
                roleNode.Text = q.RoleName;
                roleNode.NodeID = q.RoleId;
                roleNode.Expanded = true;
                roleNode.EnableClickEvent = true;
                rootNode.Nodes.Add(roleNode);
            }
        }
        #endregion

        #region  遍历节点方法(系统功能)

        /// <summary>
        /// 加载菜单树:动态加载
        /// </summary>
        private void InitMenuTree()
        {
            this.tvMenu.Nodes.Clear();
            TreeNode rootNode = new TreeNode();//定义根节点
            rootNode.Text = "系统功能";
            rootNode.NodeID = "0";
            rootNode.Expanded = true;
            rootNode.EnableCheckBox = true;
            this.tvMenu.Nodes.Add(rootNode);
            // this.GetNodes(rootNode.ChildNodes, null);
        }

        /// <summary>
        /// 加载菜单树:动态加载
        /// </summary>
        private void MenuBindDataBySystem(string systemId)
        {
            this.tvMenu.Nodes.Clear();
            TreeNode rootNode = new TreeNode();//定义根节点
            rootNode.Text = "系统功能";
            rootNode.NodeID = "0";
            rootNode.Expanded = true;
            rootNode.EnableCheckBox = true;
            rootNode.EnableCheckEvent = true;
            this.tvMenu.Nodes.Add(rootNode);
            this.GetNodes(rootNode.Nodes, null, systemId);
        }

        /// <summary>
        /// 遍历节点方法
        /// </summary>
        /// <param name="nodes">节点集合</param>
        /// <param name="parentId">父节点</param>
        private void GetNodes(TreeNodeCollection nodes, string parentId, string systemId)
        {
            List<Model.Sys_Menu> menu = null;
            if (parentId == null)
            {
                menu = (from x in BLL.Funs.DB.Sys_Menu where x.SuperMenu == "0" && x.MenuModule == systemId orderby x.SortIndex select x).ToList();
            }
            else
            {
                menu = (from x in BLL.Funs.DB.Sys_Menu where x.SuperMenu == parentId orderby x.SortIndex select x).ToList();
            }

            foreach (var q in menu)
            {
                TreeNode newNode = new TreeNode();
                newNode.Text = q.MenuName;
                newNode.NodeID = q.MenuId;
                newNode.EnableCheckEvent = true;
                newNode.EnableCheckBox = true;
                newNode.Selectable = true;
                nodes.Add(newNode);

                if (q.SuperMenu != "0")
                {
                    var buttons = (from x in BLL.Funs.DB.ButtonToMenu where x.MenuId == q.MenuId orderby x.SortIndex select x).ToList();
                    foreach (var b in buttons)
                    {
                        TreeNode bt = new TreeNode();
                        bt.Text = b.ButtonName;
                        bt.NodeID = b.ButtonToMenuId;
                        bt.EnableCheckEvent = true;
                        bt.EnableCheckBox = true;
                        bt.Selectable = true;
                        newNode.Nodes.Add(bt);
                    }
                }
            }

            for (int i = 0; i < nodes.Count; i++)
            {
                GetNodes(nodes[i].Nodes, nodes[i].NodeID, systemId);
            }
        }
        #endregion

        #region 全选、全不选
        /// <summary>
        /// 全选、全不选
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void tvMenu_NodeCheck(object sender, FineUIPro.TreeCheckEventArgs e)
        {
            if (e.Checked)
            {
                this.tvMenu.CheckAllNodes(e.Node.Nodes);
                SetCheckParentNode(e.Node);
            }
            else
            {
                this.tvMenu.UncheckAllNodes(e.Node.Nodes);
            }
        }

        /// <summary>
        /// 选中父节点
        /// </summary>
        /// <param name="node"></param>
        private void SetCheckParentNode(TreeNode node)
        {
            if (node.ParentNode != null && node.ParentNode.NodeID != "0")
            {
                node.ParentNode.Checked = true;
                if (node.ParentNode.ParentNode.NodeID != "0")
                {
                    SetCheckParentNode(node.ParentNode);
                }
            }
        }
        #endregion

        #region 角色树节点选择
        /// <summary>
        ///  树节点选择
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void tvRole_NodeCommand(object sender, FineUIPro.TreeCommandEventArgs e)
        {
            RoleId = this.tvRole.SelectedNode.NodeID;
            lbRoleName.Text = "角色:" + this.tvRole.SelectedNode.Text.Trim();
            if (MenuModuleId != null && MenuModuleId.Length < 3)
            {
                MenuBindDataBySystem(MenuModuleId);
                this.SetPowerToMenu();
            }
        }

        protected void tvProjectSystem_NodeCommand(object sender, FineUIPro.TreeCommandEventArgs e)
        {
            string pro = this.tvProjectSystem.SelectedNode.NodeID;
            MenuModuleId = pro.Split('|')[0];
            ProjectId = this.tvProjectSystem.SelectedNode.ParentNode.NodeID;
            lbSystemName.Text = "项目系统:" + this.tvProjectSystem.SelectedNode.ParentNode.Text.Trim() + "《" + this.tvProjectSystem.SelectedNode.Text.Trim() + "》";
           
            if (MenuModuleId.Length < 3 && RoleId != null)
            {
                MenuBindDataBySystem(MenuModuleId);
                SetPowerToMenu();
            }
        }
        #endregion

        #region 提交按钮事件
        /// <summary>
        /// 提交按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            if (BLL.CommonService.GetAllButtonPowerList(this.CurrUser.LoginProjectId, this.CurrUser.UserId, BLL.Const.ProjectRolePowerMenuId, BLL.Const.BtnSave))
            {

                if (!String.IsNullOrEmpty(this.RoleId) && !string.IsNullOrEmpty(this.ProjectId) && MenuModuleId != "0" && MenuModuleId.Length<3)
                {

                    BLL.Project_RoleButtonPowerService.DeleteProject_RoleButtonPower(this.RoleId, MenuModuleId, this.ProjectId);
                    BLL.Project_RolePowerService.DeleteRolePower(RoleId, MenuModuleId, this.ProjectId);

                    foreach (TreeNode tn in this.tvMenu.GetCheckedNodes())
                    {
                        if (tn.NodeID != "0")
                        {
                            if (BLL.CommonService.IsExistMenu(tn.NodeID))
                            {
                                Model.Project_RolePower newPower = new Model.Project_RolePower();
                                newPower.RoleId = this.RoleId;
                                newPower.ProjectId = this.ProjectId;
                                newPower.MenuId = tn.NodeID;
                                BLL.Project_RolePowerService.SaveProject_RolePower(newPower);
                            }

                            if (BLL.CommonService.isExistButtonToMenu(tn.NodeID))
                            {
                                Model.Project_RoleButtonPower btn = new Model.Project_RoleButtonPower();
                                btn.ProjectId = this.ProjectId;
                                btn.RoleId = this.RoleId;
                                btn.MenuId = tn.ParentNode.NodeID;
                                btn.ButtonToMenuId = tn.NodeID;
                                BLL.Project_RoleButtonPowerService.SaveProject_RoleButtonPower(btn);
                            }
                        }
                    }

                    BLL.Sys_LogService.AddLog(BLL.Const.System_1, this.CurrUser.LoginProjectId, this.CurrUser.UserId, "提交项目角色菜单授权");
                    ShowNotify("提交成功!");
                }
                else
                {
                    ShowNotify("请选择项目系统、角色!");
                }
            }
            else
            {
                ShowNotify("您没有这个权限,请与管理员联系!");
            }
        }
        #endregion

        /// <summary>
        /// 取消按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnCancel_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(RoleId))
            {
                string[] powerToMenuId = BLL.Project_RolePowerService.GetProject_RolePowerMenuIdByRoleId(RoleId, this.ProjectId);
                if (powerToMenuId != null)
                {
                    GetCheckedNodes(this.tvMenu.Nodes[0].Nodes, powerToMenuId);
                }
            }
        }

        #region 设置角色对应菜单权限
        /// <summary>
        /// 设置角色对应菜单权限
        /// </summary>
        protected void SetPowerToMenu()
        {
            if (!String.IsNullOrEmpty(RoleId))
            {
                string[] powerToMenuId = BLL.Project_RolePowerService.GetProject_RolePowerMenuIdByRoleId(RoleId, ProjectId);
                if (powerToMenuId != null)
                {
                    GetCheckedNodes(this.tvMenu.Nodes[0].Nodes, powerToMenuId);
                }
            }
        }

        /// <summary>
        /// 遍历获取有权限的节点
        /// </summary>
        /// <param name="nodes">节点集合</param>
        /// <param name="power">权限集合</param>
        private void GetCheckedNodes(TreeNodeCollection nodes, string[] powerToMenuId)
        {
            foreach (TreeNode tn in nodes)
            {
                tn.Checked = false;
                tn.Expanded = false;
                if (powerToMenuId.Contains(tn.NodeID))
                {
                    tn.Checked = true;
                    tn.Expanded = true;
                }
                if (tn.ParentNode.NodeID != "0")
                {
                    if (powerToMenuId.Contains(tn.ParentNode.NodeID))
                    {
                        var btpower = from x in BLL.Funs.DB.Project_RoleButtonPower where x.RoleId == RoleId && x.ProjectId == this.ProjectId && x.MenuId == tn.ParentNode.NodeID select x.ButtonToMenuId;

                        if (btpower.Contains(tn.NodeID))
                        {
                            tn.Checked = true;
                        }
                    }
                }
            }

            for (int i = 0; i < nodes.Count; i++)
            {
                GetCheckedNodes(nodes[i].Nodes, powerToMenuId);
            }
        }
        #endregion

    }
}