using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace FineUIPro.Web.Controls
{
    public class MultiHeaderTable
    {// 包含 rowspan,colspan 的多表头,方便生成 HTML 的 table 标签
        public List<List<object[]>> MultiTable = new List<List<object[]>>();
        // 最终渲染的列数组
        public List<GridColumn> Columns = new List<GridColumn>();


        public void ResolveMultiHeaderTable(GridColumnCollection columns)
        {
            List<object[]> row = new List<object[]>();
            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<object[]> row)
        {
            foreach (object[] cell in row)
            {
                GroupField groupField = cell[2] as GroupField;
                if (groupField != null && groupField.Columns.Count > 0)
                {
                    List<object[]> subrow = new List<object[]>();
                    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<object[]> row, int level)
        {
            List<object[]> nextrow = new List<object[]>();

            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
                        });
                    }
                }
            }

            MultiTable.Add(row);

            // 如果当前下一行,则增加上一行(向上递归)中没有子列的列的 rowspan
            if (nextrow.Count > 0)
            {
                PlusRowspan(level);

                ResolveMultiTable(nextrow, level + 1);
            }
        }

        private void PlusRowspan(int level)
        {
            if (level < 0)
            {
                return;
            }

            foreach (object[] cells in MultiTable[level])
            {
                GroupField groupField = cells[2] as GroupField;
                if (groupField != null && groupField.Columns.Count > 0)
                {
                    // ...
                }
                else
                {
                    cells[0] = Convert.ToInt32(cells[0]) + 1;
                }
            }

            PlusRowspan(level - 1);
        }

        private void PlusColspan(int level, GridColumn parent, int plusCount)
        {
            if (level < 0)
            {
                return;
            }

            foreach (object[] cells in MultiTable[level])
            {
                GridColumn column = cells[2] as GridColumn;
                if (column == parent)
                {
                    cells[1] = Convert.ToInt32(cells[1]) + plusCount;

                    PlusColspan(level - 1, cells[3] as GridColumn, plusCount);
                }
            }
        }


    }

}