using FlutterCodeGenerator.Helper;
using System;
using System.Text;
namespace FlutterCodeGenerator.ModelTypes
{
///
/// User Defined Generic Complex Model Type
///
internal class UserDefinedGenericModelType : ComplexModelType
{
public ModelType GenericArgumentModelType;
public UserDefinedGenericModelType(Type type, string name) : base(type, name)
{
var properties = type.GetProperties();
foreach (var property in properties)
{
var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
Children.Add(child);
}
var modelType = ModelTypeGenerator.Create(type.GetGenericArguments()[0], "");
GenericArgumentModelType = modelType;
}
public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
{
if (Index > 1)
{
if (isDefault)
{
return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + Index + ">";
}
if (isGenericName)
{
return ParameterType.Name[0..^2] + Index + "";
}
if (isSingle)
{
return ParameterType.Name[0..^2] + Index;
}
return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + Index + ">";
}
else
{
if (isDefault)
{
return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
}
if (isGenericName)
{
return ParameterType.Name[0..^2] + "";
}
if (isSingle)
{
return ParameterType.Name[0..^2];
}
return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
}
}
public override string GetDartString()
{
var dartString = new StringBuilder();
dartString.AppendLine($"class {GetFlutterTypeName(false, true)} {{");
foreach (var child in Children)
{
string argumentName;
var questionMark = QuestionMarkCheck(child);
if (child is ListModelType listModelType)
{
argumentName = GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType ? listModelType.GetFlutterTypeName(false, true) : listModelType.GetFlutterTypeName();
}
else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType)
{
argumentName = GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType ? userDefinedGenericComplexModelType.GetFlutterTypeName(false, true) : userDefinedGenericComplexModelType.GetFlutterTypeName();
}
else
{
argumentName = child.GetFlutterTypeName();
}
dartString.AppendLine($"\t{argumentName}{questionMark} {child.Name_Lower};");
}
dartString.AppendLine();
dartString.AppendLine($"\t{GetFlutterTypeName(false, false, true)}({{");
foreach (var child in Children)
{
if (child.DefaultValue != null)
{
dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
}
else
{
dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
}
}
dartString.AppendLine("\t});");
dartString.AppendLine();
dartString.Append(FromJson(Children));
dartString.Append(ToJson(Children));
dartString.AppendLine("}");
return dartString.ToString();
}
}
}