using Luban.Job.Cfg.DataSources.Excel;
using Luban.Job.Cfg.Defs;
using Luban.Job.Cfg.TypeVisitors;
using Luban.Job.Common.Types;
using Luban.Job.Common.TypeVisitors;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Luban.Job.Cfg.DataConverts
{
class TitleCreator : ITypeActionVisitor
{
public static TitleCreator Ins { get; } = new();
public Title CreateTitle(DefTable table)
{
TBean type = table.ValueTType;
//if (bean.IsDynamic)
//{
// throw new Exception($"bean:{bean.Bean.FullName} 是多态bean,暂不支持");
//}
var title = new Title()
{
Root = true,
Name = "__root__",
Tags = new Dictionary(),
FromIndex = 1,
};
int lastColumn = 0;
if (type.IsDynamic)
{
title.AddSubTitle(new Title()
{
Name = "__type__",
FromIndex = lastColumn + 1,
ToIndex = lastColumn + 1,
Tags = new Dictionary(),
});
++lastColumn;
}
var fields = type.IsDynamic ? type.Bean.HierarchyNotAbstractChildren.SelectMany(c => c.HierarchyFields) : type.Bean.HierarchyFields;
foreach (var f in fields)
{
if (title.SubTitles.ContainsKey(f.Name))
{
continue;
}
int startColumn = lastColumn + 1;
var subTitle = new Title()
{
Name = f.Name,
FromIndex = startColumn,
ToIndex = startColumn,
Tags = new Dictionary(),
};
if (f.CType.Tags.TryGetValue("sep", out var sep))
{
subTitle.Tags.Add("sep", sep);
}
f.CType.Apply(this, subTitle, startColumn);
lastColumn = subTitle.ToIndex;
title.AddSubTitle(subTitle);
}
title.ToIndex = Math.Max(lastColumn, 1);
if (table.IsMapTable)
{
title.SubTitles[table.IndexField.Name].Tags.TryAdd("non_empty", "1");
}
title.Init();
return title;
}
public void Accept(TBool type, Title title, int column)
{
}
public void Accept(TByte type, Title title, int column)
{
}
public void Accept(TShort type, Title title, int column)
{
}
public void Accept(TFshort type, Title title, int column)
{
}
public void Accept(TInt type, Title title, int column)
{
}
public void Accept(TFint type, Title title, int column)
{
}
public void Accept(TLong type, Title title, int column)
{
}
public void Accept(TFlong type, Title title, int column)
{
}
public void Accept(TFloat type, Title title, int column)
{
}
public void Accept(TDouble type, Title title, int column)
{
}
public void Accept(TEnum type, Title title, int column)
{
}
public void Accept(TString type, Title title, int column)
{
}
public void Accept(TBytes type, Title title, int column)
{
}
public void Accept(TText type, Title title, int column)
{
// 默认使用 # 来分割
if (!title.Tags.ContainsKey("sep"))
{
title.Tags.Add("sep", "#");
}
}
public void Accept(TBean type, Title title, int column)
{
title.FromIndex = column;
title.ToIndex = column;
if (!title.Tags.ContainsKey("sep"))
{
title.Tags.Add("sep", "|");
}
//int lastColumn = column - 1;
//if (type.IsDynamic)
//{
// title.AddSubTitle(new Title()
// {
// Name = "__type__",
// FromIndex = lastColumn + 1,
// ToIndex = lastColumn + 1,
// Tags = new Dictionary(),
// });
// ++lastColumn;
//}
//foreach (var f in type.Bean.HierarchyFields)
//{
// int startColumn = lastColumn + 1;
// var subTitle = new Title()
// {
// Name = f.Name,
// FromIndex = startColumn,
// ToIndex = startColumn,
// Tags = new Dictionary(),
// };
// if (f.CType.Tags.TryGetValue("sep", out var sep))
// {
// subTitle.Tags.Add("sep", sep);
// }
// if (f.CType.Tags.TryGetValue("multi_rows", out var multiRows))
// {
// subTitle.Tags.Add("multiRows", multiRows);
// }
// f.CType.Apply(this, subTitle, startColumn);
// lastColumn = subTitle.ToIndex;
// title.AddSubTitle(subTitle);
//}
//title.ToIndex = Math.Max(lastColumn, column);
//int maxFieldNum = 20;
//if (type.IsDynamic)
//{
// if (!title.Tags.ContainsKey("sep"))
// {
// title.Tags.Add("sep", "|");
// }
// //var maxFieldCount = type.Bean.HierarchyNotAbstractChildren.Max(c => c.HierarchyFields.Count);
// //var fields = type.Bean.HierarchyNotAbstractChildren.SelectMany(c => c.HierarchyFields).Select(f => f.Name).ToHashSet();
// title.ToIndex = column;
//}
//else
//{
// int lastColumn = column - 1;
// foreach (var f in type.Bean.HierarchyFields)
// {
// int startColumn = lastColumn + 1;
// var subTitle = new Title()
// {
// Name = f.Name,
// FromIndex = startColumn,
// ToIndex = startColumn,
// Tags = new Dictionary(),
// };
// if (f.CType.Tags.TryGetValue("sep", out var sep))
// {
// subTitle.Tags.Add("sep", sep);
// }
// if (f.CType.Tags.TryGetValue("multi_rows", out var multiRows))
// {
// subTitle.Tags.Add("multiRows", multiRows);
// }
// f.CType.Apply(this, subTitle, startColumn);
// lastColumn = subTitle.ToIndex;
// title.AddSubTitle(subTitle);
// }
// title.ToIndex = Math.Max(lastColumn, column);
//}
}
public void Accept(TArray type, Title title, int column)
{
if (!type.ElementType.Apply(IsNotSepTypeVisitor.Ins))
{
title.Tags.TryAdd("sep", "|");
}
}
public void Accept(TList type, Title title, int column)
{
if (!type.ElementType.Apply(IsNotSepTypeVisitor.Ins))
{
title.Tags.TryAdd("sep", "|");
}
}
public void Accept(TSet type, Title title, int column)
{
if (!type.ElementType.Apply(IsNotSepTypeVisitor.Ins))
{
title.Tags.TryAdd("sep", "|");
}
}
public void Accept(TMap type, Title title, int column)
{
title.Tags.TryAdd("sep", "|");
}
public void Accept(TVector2 type, Title title, int column)
{
}
public void Accept(TVector3 type, Title title, int column)
{
}
public void Accept(TVector4 type, Title title, int column)
{
}
public void Accept(TDateTime type, Title title, int column)
{
}
}
}