using Serenity;
using System;
using System.Collections.Generic;
using System.Linq;

namespace WaterCloud.Code
{
	/// <summary>
	///封装table查询数据
	/// </summary>
	/// <typeparam name="T"></typeparam>
	public class SoulPage<T>
	{
		/**
     * layui表格必须参数⬇⬇⬇⬇⬇⬇
     */
		public int state { get; set; }
		public string message { get; set; }
		/**
         * 总记录
         */
		public int count { get; set; }
		/**
         * 显示的记录
         */
		public List<T> data { get; set; }

		/**
         * 请求条件
         */
		public object obj { get; set; }
		/**
         * 查询条件
         */
		public Dictionary<string, object> condition = new Dictionary<string, object>();
		/**
         * 请求参数⬇⬇⬇⬇⬇⬇
         */
		/**
         * 当前页 从1开始
         */
		public int page { get; set; }
		/**
         * 页大小
         */
		public int rows { get; set; }
		/**
         * 查询列数据
         */
		public string columns { get; set; }

		/**
         * 表格列类型
         */
		public string tableFilterType { get; set; }
		/**
         * 筛选信息
         */
		public string filterSos { get; set; }

		/**
         * 排序信息
         */
		public string field { get; set; }

		public string order { get; set; }

		public SoulPage()
		{
			this.state = 0;
			this.message = "";
			this.page = 1;
			this.rows = 100000000;
			this.order = "asc";
		}

		public SoulPage(int page, int limit)
		{
			this.state = 0;
			this.message = "";
			this.page = 1;
			this.rows = 100000000;
			this.order = "asc";
			this.page = page;
			this.rows = limit;
		}

		public List<FilterSo> getFilterSos()
		{
			if (string.IsNullOrEmpty(filterSos))
			{
				return new List<FilterSo>();
			}
			return filterSos.ToObject<List<FilterSo>>();
		}

		public bool isColumn()
		{
			return getColumns().Count > 0;
		}

		public int getOffset()
		{
			return (page - 1) * rows;
		}

		public List<string> getColumns()
		{
			return !string.IsNullOrEmpty(columns) ? columns.ToObject<List<string>>() : new List<string>();
		}

		private string dateFormat(DateTime date, string format)
		{
			if (string.IsNullOrEmpty(format))
			{
				return date.ToString("yyyy-MM-dd HH:mm:ss");
			}
			else
			{
				return date.ToString(format);
			}
		}

		public Dictionary<string, Dictionary<string, string>> getTypeMap()
		{
			Dictionary<string, Dictionary<string, string>> typeMap = new Dictionary<string, Dictionary<string, string>>();
			if (!string.IsNullOrEmpty(tableFilterType))
			{
				Dictionary<string, string> filterType = tableFilterType.ToObject<Dictionary<string, string>>();
				foreach (var item in filterType)
				{
					Dictionary<string, string> map = new Dictionary<string, string>();
					map.Add("type", item.Value.Substring(0, item.Value.IndexOf("[")));
					int IndexofA = item.Value.IndexOf('['); //字符串的话总以第一位为指定位置
					int IndexofB = item.Value.IndexOf(']');
					map.Add("value", item.Value.Substring(IndexofA + 1, IndexofB - IndexofA - 1));
					typeMap.Add(item.Key, map);
				};
			}
			return typeMap;
		}

		public string getFormatValue(Dictionary<string, Dictionary<string, string>> typeMap, string column, object columnObject)
		{
			string columnValue;
			if (typeMap.ContainsKey(column))
			{
				if ("date".Equals(typeMap.Get(column).Get("type")) && columnObject is DateTime)
				{
					columnValue = dateFormat((DateTime)columnObject, typeMap.Get(column).Get("value"));
				}
				else
				{
					columnValue = columnObject.ToString();
				}
			}
			else
			{
				if (columnObject is DateTime || columnObject is Nullable<DateTime>)
				{
					columnValue = dateFormat((DateTime)columnObject, null);
				}
				else if (columnObject is bool || columnObject is Nullable<bool>)
				{
					columnValue = (bool)columnObject == true ? "1" : "0";
				}
				else
				{
					columnValue = columnObject.ToString();
				}
			}
			return columnValue;
		}

		public Object setData(List<T> data)
		{
			if (isColumn())
			{
				Dictionary<string, Dictionary<string, string>> typeMap = getTypeMap();
				Dictionary<string, HashSet<string>> columnMap = new Dictionary<string, HashSet<string>>();
				foreach (T datum in data)
				{
					foreach (string column in getColumns())
					{
						if (!columnMap.ContainsKey(column))
						{
							columnMap.Add(column, new HashSet<string>());
						}
						var columnObject = ReflectionHelper.GetObjectPropertyValue(datum, column);
						if (columnObject != null)
						{ //空值不展示
							columnMap.Get(column).Add(getFormatValue(typeMap, column, columnObject));
						}
					}
				}
				Dictionary<string, List<string>> columnSortMap = new Dictionary<string, List<string>>();
				foreach (var item in columnMap)
				{
					columnSortMap.Add(item.Key, item.Value.ToList());
				}
				return columnSortMap;
			}
			else
			{
				this.data = data;
				return this;
			}
		}
	}
}