using BLL;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
namespace FineUIPro.Web.JDGL.SGManPower
{
    public partial class ManPowerPlanGrid : PageBase
    {
        #region Page_Init
        // 注意:动态创建的代码需要放置于Page_Init(不是Page_Load),这样每次构造页面时都会执行
        protected void Page_Init(object sender, EventArgs e)
        {
            InitGrid();
        }
        public DataTable GridTable = new DataTable();
        private void InitGrid()
        {
            FineUIPro.BoundField bf;
            FineUIPro.RenderField rf;
            FineUIPro.TextBox txTextBox;
            // 设置Grid的编辑属性
            Grid1.AllowCellEditing = true;
            Grid1.ClicksToEdit = 1;
            Grid1.EnableAfterEditEvent = true;
            UnitId = Request.Params["UnitId"];
            StartTime = Request.Params["StartTime"];
            EndTime = Request.Params["EndTime"];
            GridTable.Columns.Add("Id");
            // 添加主键列用于编辑操作
            GridTable.Columns.Add("PrimaryKeyMap"); // 用于存储原始记录的ID
            // 添加隐藏列来存储额外的ID信息
            GridTable.Columns.Add("UnitId");
            GridTable.Columns.Add("UnitWorkId");
            GridTable.Columns.Add("WorkPostId");
            ListItem[] list = new ListItem[6];
            list[0] = new ListItem("序号", "SerialNumber");
            list[1] = new ListItem("单位", "UnitName");
            list[2] = new ListItem("装置", "UnitWorkName");
            list[3] = new ListItem("岗位", "WorkPostName");
            list[4] = new ListItem("版本", "Version");
            list[5] = new ListItem("累计", "TotalCount");
            foreach (var item in list)
            {
                bf = new FineUIPro.BoundField();
                bf.ColumnID = item.Value;
                bf.DataField = item.Value;
                bf.HeaderText = item.Text;
                bf.HeaderTextAlign = TextAlign.Center;
                bf.TextAlign = TextAlign.Center;
                bf.Locked = true;
                Grid1.Columns.Add(bf);
                GridTable.Columns.Add(item.Value);
            }
            // 动态获取日期范围
            DateTime startDate = Convert.ToDateTime(StartTime);
            DateTime endDate = Convert.ToDateTime(EndTime);
            var dateRange = Enumerable.Range(0, (endDate - startDate).Days + 1)
                .Select(i => startDate.AddDays(i))
                .ToList();
            // 按年分组日期
            var groupedByYear = dateRange.GroupBy(d => d.Year)
                .OrderBy(g => g.Key)
                .ToList();
            foreach (var yearGroup in groupedByYear)
            {
                GroupField yearGroupField = new GroupField();
                yearGroupField.HeaderText = $"{yearGroup.Key}年";
                yearGroupField.TextAlign = TextAlign.Center;
                // 按月分组
                var groupedByMonth = yearGroup.GroupBy(d => d.Month)
                    .OrderBy(g => g.Key)
                    .ToList();
                foreach (var monthGroup in groupedByMonth)
                {
                    GroupField monthGroupField = new GroupField();
                    monthGroupField.HeaderText = $"{monthGroup.Key}月";
                    monthGroupField.TextAlign = TextAlign.Center;
                    // 添加具体日期的列
                    foreach (var date in monthGroup.OrderBy(d => d))
                    {
                        rf = new FineUIPro.RenderField();
                        rf.ColumnID = date.ToString("yyyy-MM-dd");
                        rf.DataField = date.ToString("yyyy-MM-dd");
                        rf.HeaderText = date.ToString("dd");
                        rf.HeaderTextAlign = TextAlign.Center;
                        rf.TextAlign = TextAlign.Center;
                        txTextBox = new FineUIPro.TextBox();
                        txTextBox.ID = "txt" + date.ToString("yyyy-MM-dd");
                        rf.Editor.Add(txTextBox);
                        monthGroupField.Columns.Add(rf);
                        GridTable.Columns.Add(date.ToString("yyyy-MM-dd"));
                    }
                    yearGroupField.Columns.Add(monthGroupField);
                }
                Grid1.Columns.Add(yearGroupField);
            }
        }
        #endregion
        public string UnitId
        {
            get => (string)ViewState["UnitId"];
            set => ViewState["UnitId"] = value;
        }
        public string StartTime
        {
            get => (string)ViewState["StartTime"];
            set => ViewState["StartTime"] = value;
        }
        public string EndTime
        {
            get => (string)ViewState["EndTime"];
            set => ViewState["EndTime"] = value;
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.GetButtonPower();
                Funs.DropDownPageSize(this.ddlPageSize);
                // 设置Grid的PageSize与下拉框默认值一致
                Grid1.PageSize = Convert.ToInt32(ddlPageSize.SelectedValue);
                WorkPostService.InitWorkPostDropDownList(this.drpWorkPost, true); //岗位
                UnitWorkService.InitUnitWorkDownList(drpUnitWork, this.CurrUser.LoginProjectId, true); //单位工程(装置)
                //版本
                this.drpVersion.DataTextField = "Version";
                this.drpVersion.DataValueField = "Version";
                this.drpVersion.DataSource = BLL.ManPowerPlanService.getGroupVersion(this.CurrUser.LoginProjectId);
                this.drpVersion.DataBind();
                // 绑定表格
                this.BindGrid();
            }
        }
        
       
        #region 绑定数据
        /// 
        /// 绑定数据
        ///  
        private void BindGrid()
        {
            
            // 清空现有数据
            GridTable.Clear();
            // 重新添加列定义(保持列结构)
            if (GridTable.Columns.Count == 0)
            {
                GridTable.Columns.Add("Id");
                GridTable.Columns.Add("UnitId");
                GridTable.Columns.Add("UnitWorkId");
                GridTable.Columns.Add("WorkPostId");
                GridTable.Columns.Add("Version");
                GridTable.Columns.Add("PrimaryKeyMap");
                // 添加动态日期列(这部分已经在InitGrid中定义了)
                ListItem[] list = new ListItem[6];
                list[0] = new ListItem("序号", "SerialNumber");
                list[1] = new ListItem("单位", "UnitName");
                list[2] = new ListItem("装置", "UnitWorkName");
                list[3] = new ListItem("岗位", "WorkPostName");
                list[4] = new ListItem("版本", "Version");
                list[5] = new ListItem("累计", "TotalCount");
                foreach (var item in list)
                {
                    GridTable.Columns.Add(item.Value);
                }
                // 日期列会在InitGrid中添加,这里不需要重复添加
            }
            else
            {
                // 清空行数据但保持列结构
                GridTable.Rows.Clear();
            }
            // 获取当前项目的人力计划数据
            var manpowerPlans = (from x in Funs.DB.JDGL_SGManPower
                join y in Funs.DB.Base_WorkPost on x.WorkPostId equals y.WorkPostId
                where x.ProjectId == this.CurrUser.LoginProjectId
                orderby y.WorkPostCode
                select x).ToList();
            
            if (UnitId != Const._Null)
            {
                manpowerPlans = manpowerPlans.Where(x => x.UnitId == UnitId).ToList();
            }
            if (drpWorkPost.SelectedValue != Const._Null)
            {
                manpowerPlans = manpowerPlans.Where(x => x.WorkPostId == drpWorkPost.SelectedValue).ToList();
            }
            if (drpUnitWork.SelectedValue != Const._Null)
            {
                manpowerPlans = manpowerPlans.Where(x => x.UnitWorkId == drpUnitWork.SelectedValue).ToList();
            }
            
            if (drpVersion.SelectedValue != Const._Null)
            {
                manpowerPlans = manpowerPlans.Where(x => x.Version == drpVersion.SelectedValue).ToList();
            }
            
            // 获取所有相关单位、装置和岗位信息
            var units = Funs.DB.Base_Unit.ToList();
            var unitWorks = Funs.DB.WBS_UnitWork.ToList();
            var workPosts = Funs.DB.Base_WorkPost.ToList();
            // 按单位、装置、岗位分组数据
            var groupedData = manpowerPlans
                .GroupBy(x => new { x.UnitId, x.UnitWorkId, x.WorkPostId, x.Version })
                .ToList();
            var count = groupedData.Count();
            Grid1.RecordCount = count;
            groupedData = groupedData.Skip(Grid1.PageSize * Grid1.PageIndex).Take(Grid1.PageSize).ToList();
            foreach (var group in groupedData)
            {
                DataRow row = GridTable.NewRow();
                // 基本信息
                var firstItem = group.First();
                row["Id"] = Guid.NewGuid().ToString(); // 生成唯一ID用于行标识
                row["SerialNumber"] = GridTable.Rows.Count + 1; // 序号
                // 单位信息
                var unit = units.FirstOrDefault(u => u.UnitId == firstItem.UnitId);
                row["UnitName"] = unit != null ? unit.UnitName : "";
                row["UnitId"] = firstItem.UnitId ?? (object)DBNull.Value;
                // 装置信息
                var unitWork = unitWorks.FirstOrDefault(uw => uw.UnitWorkId == firstItem.UnitWorkId);
                row["UnitWorkName"] = unitWork != null ? unitWork.UnitWorkName : "";
                // 当UnitWorkId为null时,保持为null而不是空字符串
                row["UnitWorkId"] = firstItem.UnitWorkId ?? (object)DBNull.Value;
                // 岗位信息
                var workPost = workPosts.FirstOrDefault(wp => wp.WorkPostId == firstItem.WorkPostId);
                row["WorkPostName"] = workPost != null ? workPost.WorkPostName : "";
                row["WorkPostId"] = firstItem.WorkPostId ?? (object)DBNull.Value;
                // 版本信息
                row["Version"] = firstItem.Version ?? "";
                // 计算累计数量
                int totalCount = 0;
                // 存储主键信息,用于编辑操作
                // 创建一个字典来存储每个日期对应的记录ID
                var dateIdMap = new Dictionary();
                // 日期相关的人力数据
                foreach (var item in group)
                {
                    if (item.PlanDate.HasValue)
                    {
                        string dateColumnId = item.PlanDate.Value.ToString("yyyy-MM-dd");
                        // 确保列存在
                        if (GridTable.Columns.Contains(dateColumnId))
                        {
                            int quantity = item.Quantity ?? 0;
                            row[dateColumnId] = quantity;
                            dateIdMap[dateColumnId] = item.Id; // 记录每个日期对应的记录ID
                            totalCount += quantity; // 累计数量
                        }
                    }
                }
                // 设置累计数量
                row["TotalCount"] = totalCount;
                // 将ID映射序列化后存储到行中
                row["PrimaryKeyMap"] = Newtonsoft.Json.JsonConvert.SerializeObject(dateIdMap);
                GridTable.Rows.Add(row);
            }
            Grid1.DataSource = GridTable;
            Grid1.DataBind();
            // 计算汇总数据
            OutputSummaryData();
        }
        #region 计算合计
        /// 
        /// 计算合计
        ///  
        private void OutputSummaryData()
        {
            // 创建用于存储合计值的对象
            JObject summary = new JObject();
            // 设置固定列的合计值
            summary.Add("UnitName", "合计");
            // 计算TotalCount列的合计值
            int totalCountSum = 0;
            foreach (DataRow row in GridTable.Rows)
            {
                if (row["TotalCount"] != DBNull.Value && row["TotalCount"] != null)
                {
                    int value;
                    if (int.TryParse(row["TotalCount"].ToString(), out value))
                    {
                        totalCountSum += value;
                    }
                }
            }
            summary.Add("TotalCount", totalCountSum.ToString());
            // 计算日期列的合计值
            foreach (DataColumn column in GridTable.Columns)
            {
                // 检查是否为日期列(格式为 yyyy-MM-dd)
                DateTime date;
                if (DateTime.TryParseExact(column.ColumnName, "yyyy-MM-dd", null,
                        System.Globalization.DateTimeStyles.None, out date))
                {
                    // 计算该列的合计值
                    int columnSum = 0;
                    foreach (DataRow row in GridTable.Rows)
                    {
                        if (row[column.ColumnName] != DBNull.Value && row[column.ColumnName] != null)
                        {
                            int value;
                            if (int.TryParse(row[column.ColumnName].ToString(), out value))
                            {
                                columnSum += value;
                            }
                        }
                    }
                    summary.Add(column.ColumnName, columnSum.ToString());
                }
            }
            // 设置汇总数据
            Grid1.SummaryData = summary;
        }
        #endregion
        #endregion
        #region GV 数据操作
        /// 
        /// 分页
        ///  
        /// 
        /// 排序
        ///  
        /// 
        /// 分页显示条数下拉框
        ///  
        /// 
        /// 查询
        ///  
        /// 
        /// 统计图表
        ///  
        /// 
        /// 获取按钮权限
        ///  
        /// 
        /// 关闭弹出窗
        ///  
        /// 
        /// 导出方法 - 支持多级表头
        ///  
        /// 
        private string GetGridTableHtml(Grid grid)
        {
            StringBuilder sb = new StringBuilder();
            MultiHeaderTable mht = new MultiHeaderTable();
            mht.ResolveMultiHeaderTable(grid.Columns);
            sb.Append("");
            // 生成多级表头
            foreach (List rows in mht.MultiTable)
            {
                sb.Append("");
                foreach (object[] cell in rows)
                {
                    int rowspan = 1;
                    int colspan = Convert.ToInt32(cell[1]);
                    GridColumn column = cell[2] as GridColumn;
                    // 对于锁定列(固定列),确保rowspan为3
                    if (column.Locked)
                    {
                        rowspan = 3;
                    }
                    sb.AppendFormat("{3} ",
                        " rowspan=\"" + rowspan + "\"",
                        colspan != 1 ? " colspan=\"" + colspan + "\"" : "",
                        colspan != 1 ? " style=\"text-align:center;\"" : "",
                        column.HeaderText);
                }
                sb.Append(" ");
            }
            // 生成数据行
            foreach (GridRow row in grid.Rows)
            {
                sb.Append("");
                foreach (GridColumn column in mht.Columns)
                {
                    string html = row.Values[column.ColumnIndex].ToString();
                    // 特殊处理固定列
                    if (column.ColumnID == "UnitName")
                    {
                        html = row.Values[column.ColumnIndex].ToString();
                    }
                    else if (column.ColumnID == "UnitWorkName")
                    {
                        html = row.Values[column.ColumnIndex].ToString();
                    }
                    else if (column.ColumnID == "WorkPostName")
                    {
                        html = row.Values[column.ColumnIndex].ToString();
                    }
                    else if (column.ColumnID == "Version")
                    {
                        html = row.Values[column.ColumnIndex].ToString();
                    }
                    else if (column.ColumnID == "TotalCount")
                    {
                        html = row.Values[column.ColumnIndex].ToString();
                    }
                    // 处理日期列(格式为 yyyy-MM-dd)
                    else if (DateTime.TryParseExact(column.ColumnID, "yyyy-MM-dd", null,
                                 System.Globalization.DateTimeStyles.None, out _))
                    {
                        html = row.Values[column.ColumnIndex].ToString();
                    }
                    sb.AppendFormat("{0} ", html);
                }
                sb.Append(" ");
            }
            // 添加合计行
            if (grid.SummaryData != null)
            {
                sb.Append("");
                
                foreach (GridColumn column in mht.Columns)
                {
                    string summaryValue = "";
                    // 检查SummaryData中是否有该列的合计值
                    if (grid.SummaryData.Properties().Any(p => p.Name == column.ColumnID))
                    {
                        var property = grid.SummaryData.Properties().FirstOrDefault(p => p.Name == column.ColumnID);
                        if (property != null)
                        {
                            summaryValue = property.Value.ToString();
                        }
                    }
                    else if (column.ColumnID == "UnitName")
                    {
                        summaryValue = "合计";
                    }
                    
                    sb.AppendFormat("{0} ", summaryValue);
                }
                
                sb.Append(" ");
            }
            
            sb.Append(" 
");
            return sb.ToString();
        }
        #region 多表头处理
        /// 
        /// 处理多表头的类
        ///  
        public class MultiHeaderTable
        {
            // 包含 rowspan,colspan 的多表头,方便生成 HTML 的 table 标签
            public List> MultiTable = new List>();
            // 最终渲染的列数组
            public List Columns = new List();
            public void ResolveMultiHeaderTable(GridColumnCollection columns)
            {
                List row = new List();
                foreach (GridColumn column in columns)
                {
                    object[] cell = new object[4];
                    cell[0] = 1; // rowspan
                    cell[1] = 1; // colspan
                    cell[2] = column;
                    cell[3] = null;
                    row.Add(cell);
                }
                ResolveMultiTable(row, 0);
                ResolveColumns(row);
            }
            private void ResolveColumns(List row)
            {
                foreach (object[] cell in row)
                {
                    GroupField groupField = cell[2] as GroupField;
                    if (groupField != null && groupField.Columns.Count > 0)
                    {
                        List subrow = new List();
                        foreach (GridColumn column in groupField.Columns)
                        {
                            subrow.Add(new object[]
                            {
                                1,
                                1,
                                column,
                                groupField
                            });
                        }
                        ResolveColumns(subrow);
                    }
                    else
                    {
                        Columns.Add(cell[2] as GridColumn);
                    }
                }
            }
            private void ResolveMultiTable(List row, int level)
            {
                List nextrow = new List();
                foreach (object[] cell in row)
                {
                    GroupField groupField = cell[2] as GroupField;
                    if (groupField != null && groupField.Columns.Count > 0)
                    {
                        // 如果当前列包含子列,则更改当前列的 colspan,以及增加父列(向上递归)的colspan
                        cell[1] = Convert.ToInt32(groupField.Columns.Count);
                        PlusColspan(level - 1, cell[3] as GridColumn, groupField.Columns.Count - 1);
                        foreach (GridColumn column in groupField.Columns)
                        {
                            nextrow.Add(new object[]
                            {
                                1,
                                1,
                                column,
                                groupField
                            });
                        }
                    }
                    else
                    {
                        // 如果当前列不包含子列,但不是最末级列(不是叶子节点),则增加rowspan
                        if (level > 0)
                        {
                            cell[0] = level + 1;
                        }
                    }
                }
                MultiTable.Add(row);
                if (nextrow.Count > 0)
                {
                    ResolveMultiTable(nextrow, level + 1);
                }
            }
            private void PlusColspan(int level, GridColumn column, int colspan)
            {
                if (level < 0)
                {
                    return;
                }
                foreach (List rows in MultiTable)
                {
                    foreach (object[] cells in rows)
                    {
                        if (cells[2] == column)
                        {
                            cells[1] = Convert.ToInt32(cells[1]) + colspan;
                            PlusColspan(level - 1, cells[3] as GridColumn, colspan);
                            break;
                        }
                    }
                }
            }
        }
        #endregion
        #endregion
        #region 编辑单元格
        protected void Grid1_AfterEdit(object sender, GridAfterEditEventArgs e)
        {
            Dictionary> modifiedDict = Grid1.GetModifiedDict();
            foreach (int rowIndex in modifiedDict.Keys)
            {
                // 确保GridTable中有足够的行
                if (GridTable.Rows.Count <= rowIndex)
                {
                    // 如果GridTable中没有足够的行,重新绑定数据
                    BindGrid();
                }
                // 再次检查是否有了足够的行
                if (GridTable.Rows.Count <= rowIndex)
                {
                    ShowNotify("数据状态异常,请刷新页面后重试!");
                    return;
                }
                // 获取行ID
                string rowId = Grid1.DataKeys[rowIndex][0].ToString();
                //获取固定列的列数据
                var d = GridTable.Rows[rowIndex];
                string unitId = null;
                var UnitIdValue = GridTable.Rows[rowIndex]["UnitId"];
                if (UnitIdValue != null && UnitIdValue != DBNull.Value)
                {
                    unitId = UnitIdValue.ToString();
                }
                // 处理可能为null的unitWorkId
                string unitWorkId = null;
                var unitWorkIdValue = GridTable.Rows[rowIndex]["UnitWorkId"];
                if (unitWorkIdValue != null && unitWorkIdValue != DBNull.Value)
                {
                    unitWorkId = unitWorkIdValue.ToString();
                }
                string workPostId = null;
                var workPostIdValue = GridTable.Rows[rowIndex]["WorkPostId"];
                if (workPostIdValue != null && workPostIdValue != DBNull.Value)
                {
                    workPostId = workPostIdValue.ToString();
                }
                string version = GridTable.Rows[rowIndex]["Version"].ToString();
                // 获取主键映射信息
                string primaryKeyMapJson = GridTable.Rows[rowIndex]["PrimaryKeyMap"].ToString();
                var dateIdMap =
                    Newtonsoft.Json.JsonConvert.DeserializeObject>(primaryKeyMapJson)
                    ?? new Dictionary();
                // 遍历该行中被修改的列
                foreach (string columnName in modifiedDict[rowIndex].Keys)
                {
                    // 获取修改后的值
                    object newValue = modifiedDict[rowIndex][columnName];
                    // 根据列名判断是否为日期列
                    DateTime planDate;
                    if (DateTime.TryParse(columnName, out planDate))
                    {
                        // 检查是否应该删除记录(值为0或空字符串)
                        bool shouldDelete = (newValue == null) ||
                                            (newValue.ToString() == "") ||
                                            (newValue.ToString() == "0");
                        if (shouldDelete)
                        {
                            // 删除记录
                            string recordId = null;
                            if (dateIdMap.ContainsKey(columnName))
                            {
                                recordId = dateIdMap[columnName];
                            }
                            DeleteManPowerPlan(recordId, unitId, unitWorkId, workPostId, version, planDate);
                            // 从映射中移除该日期
                            if (dateIdMap.ContainsKey(columnName))
                            {
                                dateIdMap.Remove(columnName);
                            }
                        }
                        else
                        {
                            // 这是一个日期列,需要更新对应的人力计划数据
                            string recordId = null;
                            // 尝试从映射中获取记录ID
                            if (dateIdMap.ContainsKey(columnName))
                            {
                                recordId = dateIdMap[columnName];
                            }
                            // 更新或创建人力计划数据
                            UpdateManPowerPlan(recordId, unitId, unitWorkId, workPostId, version, planDate, newValue);
                        }
                    }
                }
                // 更新行中的主键映射信息
                GridTable.Rows[rowIndex]["PrimaryKeyMap"] = Newtonsoft.Json.JsonConvert.SerializeObject(dateIdMap);
            }
            BindGrid();
            ShowNotify("数据保存成功!(表格数据已重新绑定)");
        }
        /// 
        /// 更新人力计划数据
        ///  
        /// 
        /// 删除人力计划数据
        ///  
        /// 
        /// 新增
        ///  
        /// 
        /// 导入按钮
        ///  
        ///