using BLL;
using Model;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace FineUIPro.Web.TestRun.TestRunManage
{
    public partial class SubSysWorkPackage : PageBase
    {
        /// 
        /// 点击树状主键
        /// 
        public string TreePreRunId { get { return (string)ViewState["TreePreRunId"]; } set { ViewState["TreePreRunId"] = value; } }
        /// 
        /// 系统主键
        /// 
        public string SystemId { get { return (string)ViewState["SystemId"]; } set { ViewState["SystemId"] = value; } }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.InitTreeMenu();//加载树
            }
        }
        #region 加载树
        /// 
        /// 加载树
        /// 
        private void InitTreeMenu()
        {
            this.tvControlItem.Nodes.Clear();
            TreeNode rootNode = new TreeNode();
            rootNode.Text = "系统划分";
            rootNode.NodeID = "0";
            rootNode.Expanded = true;
            rootNode.ToolTip = "";
            rootNode.EnableClickEvent = true;
            this.tvControlItem.Nodes.Add(rootNode);
            var allPreRunLs = Funs.DB.PreRun_SysDevice.Where(p => p.ProjectId == this.CurrUser.LoginProjectId && p.PreRunLevel <= 3).ToList();
            var onePreRunLs = allPreRunLs.Where(p => p.PreRunLevel == 1).OrderBy(x => x.Sort);
            foreach (var item in onePreRunLs)
            {
                TreeNode rootUnitNode = new TreeNode();//定义根节点
                rootUnitNode.NodeID = item.PreRunId;
                rootUnitNode.Text = item.PreRunName;
                rootUnitNode.ToolTip = item.PreRunName;
                rootUnitNode.CommandName = "";
                rootUnitNode.EnableClickEvent = true;
                rootUnitNode.EnableExpandEvent = true;
                rootNode.Nodes.Add(rootUnitNode);
                rootUnitNode.Expanded = true;
                var otherPreRunls = allPreRunLs.Where(p => p.PreRunLevel != 1).ToList();
                this.BindNodes(rootUnitNode, otherPreRunls, item.PreRunId);
            }
        }
        /// 
        ///  绑定树节点
        /// 
        private void BindNodes(TreeNode node, List list, string parentId)
        {
            var itemList = list.Where(p => p.ParentId == parentId).OrderBy(x => x.Sort).ToList();
            if (itemList.Count > 0)
            {
                foreach (var item in itemList)
                {
                    TreeNode newNode = new TreeNode();
                    newNode.Text = item.PreRunName;
                    newNode.NodeID = item.PreRunId;
                    newNode.ToolTip = item.PreRunName;
                    newNode.CommandName = "";
                    newNode.EnableClickEvent = true;
                    node.Nodes.Add(newNode);
                    BindNodes(newNode, list, item.PreRunId);
                }
            }
        }
        /// 
        /// 数加载
        /// 
        protected void tvControlItem_NodeExpand(object sender, TreeNodeEventArgs e)
        {
            if (e.Node.Nodes != null)
            {
                e.Node.Nodes.Clear();
            }
            var allPreRunLs = Funs.DB.PreRun_SysDevice.Where(p => p.ProjectId == this.CurrUser.LoginProjectId && p.PreRunLevel <= 3).ToList();
            this.BindNodes(e.Node, allPreRunLs, e.NodeID);
        }
        /// 
        /// 点击TreeView
        /// 
        /// 
        /// 
        protected void tvControlItem_NodeCommand(object sender, TreeCommandEventArgs e)
        {
            this.TreePreRunId = tvControlItem.SelectedNodeID;
            this.PageBase();
        }
        /// 
        /// 数据显示
        /// 
        public void PageBase()
        {
            var model = Funs.DB.PreRun_SysDevice.FirstOrDefault(p => p.PreRunId == this.TreePreRunId);
            if (model != null)
            {
                var ids = new List();
                if (!string.IsNullOrWhiteSpace(model.InstallationId)) ids.Add(model.InstallationId);
                if (!string.IsNullOrWhiteSpace(model.ProcessesId)) ids.Add(model.ProcessesId);
                if (!string.IsNullOrWhiteSpace(model.SystemId)) ids.Add(model.SystemId);
                var list = Funs.DB.PreRun_SysDevice.Where(p => ids.Contains(p.PreRunId) && p.PreRunLevel <= 3).ToList();
                if (list.Count(p => p.PreRunLevel == 1) > 0)
                {
                    zz.Hidden = false;
                    lblzzbm.Text = list.FirstOrDefault(p => p.PreRunLevel == 1).PreRunCode;
                    lblzzmc.Text = list.FirstOrDefault(p => p.PreRunLevel == 1).PreRunName;
                }
                if (list.Count(p => p.PreRunLevel == 2) > 0)
                {
                    gx.Hidden = false;
                    lblgxmc.Text = list.FirstOrDefault(p => p.PreRunLevel == 2).PreRunCode;
                    lblgxbm.Text = list.FirstOrDefault(p => p.PreRunLevel == 2).PreRunName;
                }
                if (list.Count(p => p.PreRunLevel == 3) > 0)
                {
                    gzb.Hidden = false;
                    BridWorkPackGrid();
                    sxt.Hidden = false;
                    var itemlist = list.FirstOrDefault(p => p.PreRunLevel == 3);
                    lblsxtmc.Text = itemlist.PreRunName;
                    lblsxtbm.Text = itemlist.PreRunCode;
                    this.SystemId = itemlist.PreRunId;
                    var workPackages = Funs.DB.TestRun_SubSysWorkPackage.Where(p => p.SystemId == this.SystemId).OrderBy(x => x.Sort).ToList();
                    if (workPackages.Count > 0)
                    {
                        var workIds = workPackages.ConvertAll(p => p.WorkPackId);
                        BridSelectWorkPack(workIds);
                        drpWorkPack.Values = workIds.ToArray();
                    }
                    else
                    {
                        Grid1.DataSource = null;
                        Grid1.DataBind();
                        drpWorkPack.Values = null;
                    }
                }
            }
        }
        #endregion
        /// 
        /// 保存
        /// 
        protected void btnSave_Click(object sender, EventArgs e)
        {
            var prerunModel = Funs.DB.PreRun_SysDevice.FirstOrDefault(p => p.PreRunId == this.TreePreRunId);
            if (prerunModel != null)
            {
                if (prerunModel.PreRunLevel == 3)
                {
                    var deleteLs = Funs.DB.TestRun_SubSysWorkPackage.Where(p => p.SystemId == prerunModel.PreRunId);
                    Funs.DB.TestRun_SubSysWorkPackage.DeleteAllOnSubmit(deleteLs);
                    Funs.DB.SubmitChanges();
                    JArray mergedData = Grid1.GetMergedData();
                    int[] selections = Grid1.SelectedRowIndexArray;
                    foreach (JObject mergedRow in mergedData)
                    {
                        string status = mergedRow.Value("status");
                        JObject values = mergedRow.Value("values");
                        int i = mergedRow.Value("index");
                        var workId = Grid1.DataKeys[i][0].ToString();
                        var model = new TestRun_SubSysWorkPackage();
                        model.SubSysId = Guid.NewGuid().ToString();
                        model.SystemId = prerunModel.PreRunId;
                        model.WorkPackId = workId;
                        model.WorkPackCode = !string.IsNullOrWhiteSpace(values.Value("WorkPackCode")) ? values.Value("WorkPackCode") : "WP";
                        model.Remark = values.Value("Remark");
                        model.AddTime = DateTime.Now;
                        model.AddUser = this.CurrUser.UserId;
                        model.Sort = Funs.DB.TestRun_SubSysWorkPackage.Count();
                        Funs.DB.TestRun_SubSysWorkPackage.InsertOnSubmit(model);
                    }
                    Funs.DB.SubmitChanges();
                    ShowNotify("保存成功!", MessageBoxIcon.Success);
                }
            }
        }
        /// 
        /// 绑定工作包
        /// 
        public void BridWorkPackGrid()
        {
            GridWorkPack.DataSource = Funs.DB.TestRun_WorkPackage.OrderBy(p => p.Sort).ToList();
            GridWorkPack.DataBind();
        }
        /// 
        /// 绑定选择的工作包
        /// 
        public void BridSelectWorkPack(List workPackIds)
        {
            if (!string.IsNullOrWhiteSpace(this.SystemId))
            {
                var result = new List();
                var queryData = from a in Funs.DB.TestRun_WorkPackage.Where(p => workPackIds.Contains(p.WorkPackId))
                                join b in Funs.DB.TestRun_SubSysWorkPackage.Where(p => p.SystemId == this.SystemId) on a.WorkPackId equals b.WorkPackId into bb
                                from t in bb.DefaultIfEmpty()
                                select new WorkData()
                                {
                                    WorkPackId = a.WorkPackId,
                                    WorkPackCode = t.WorkPackCode,
                                    WorkPackName = a.WorkPackName,
                                    SystemId = t.SystemId,
                                    Sort = a.Sort,
                                    Remark = t.Remark
                                };
                if (queryData.Count() > 0)
                {
                    int num = 1;
                    var data = queryData.ToList();
                    foreach (var item in data.OrderBy(p => p.Sort))
                    {
                        var model = new WorkData();
                        model.WorkPackId = item.WorkPackId;
                        model.WorkPackName = item.WorkPackName;
                        model.SystemId = item.SystemId;
                        if (string.IsNullOrWhiteSpace(item.WorkPackCode))
                        {
                            var workpackages = data.Where(x => !string.IsNullOrWhiteSpace(x.WorkPackCode)).ToList();
                            if (num == 1)
                            {
                                if (workpackages.Count > 0) num = workpackages.ConvertAll(x => int.Parse(x.WorkPackCode.Replace("WP", ""))).Max(m => m) + 1;
                            }
                            model.WorkPackCode = $"WP{string.Format("{0:d3}", num)}";
                            num++;
                        }
                        else
                        {
                            model.WorkPackCode = item.WorkPackCode;
                        }
                        model.Sort = num;
                        model.Remark = item.Remark;
                        result.Add(model);
                    }
                    result = result.OrderBy(p => int.Parse(Regex.Replace(p.WorkPackCode, @"\D", ""))).ToList();
                    Grid1.DataSource = result;
                    Grid1.DataBind();
                }
                else
                {
                    Grid1.DataSource = null;
                    Grid1.DataBind();
                }
            }
        }
        /// 
        /// 工作包选择
        /// 
        /// 
        /// 
        protected void drpWorkPack_TextChanged(object sender, EventArgs e)
        {
            if (drpWorkPack.Values.Length > 0)
            {
                BridSelectWorkPack(drpWorkPack.Values.ToList());
            }
            else
            {
                Grid1.DataSource = null;
                Grid1.DataBind();
            }
        }
        /// 
        /// 行点击事件
        /// 
        protected void Grid1_RowCommand(object sender, GridCommandEventArgs e)
        {
            if (e.CommandName == "Delete")
            {
                string rowID = e.RowID;
                var model = Funs.DB.TestRun_SubSysWorkPackage.FirstOrDefault(p => p.WorkPackId == rowID);
                if (model != null)
                {
                    Funs.DB.TestRun_SubSysWorkPackage.DeleteOnSubmit(model);
                    Funs.DB.SubmitChanges();
                }
                var workPackages = Funs.DB.TestRun_SubSysWorkPackage.Where(p => p.SystemId == this.SystemId).ToList();
                var workIds = workPackages.ConvertAll(p => p.WorkPackId);
                BridSelectWorkPack(workIds);
                drpWorkPack.Values = workIds.ToArray();
                ShowNotify("删除成功!");
            }
        }
        public class WorkData
        {
            public string SystemId { get; set; }
            public string WorkPackId { get; set; }
            public string WorkPackName { get; set; }
            public int? Sort { get; set; }
            public string Remark { get; set; }
            public string WorkPackCode { get; set; }
        }
    }
}