Editor/ShaderGraphPlus/ProjectConverter/Node Core/ParameterConvert.cs
using Editor;
using ShaderGraphPlus.Nodes;
using VanillaGraph = Editor.ShaderGraph;
using VanillaNodes = Editor.ShaderGraph.Nodes;
using ShaderGraphBaseNode = Editor.ShaderGraph.BaseNode;

namespace ShaderGraphPlus.Internal;

file static class VanillaParameterUIExentions
{
	internal static FloatParameterUI ConvertVanillaUI( this VanillaGraph.ParameterUI parameterUI )
	{
		var newUi = new FloatParameterUI();

		newUi.Type = parameterUI.Type switch
		{
			VanillaGraph.UIType.Default => UIType.Default,
			VanillaGraph.UIType.Slider => UIType.Slider,
			VanillaGraph.UIType.Color => UIType.Default,
			_ => throw new NotImplementedException(),
		};

		newUi.Step = parameterUI.Step;
		newUi.Priority = parameterUI.Priority;
		newUi.PrimaryGroup = new() { Name = parameterUI.PrimaryGroup.Name, Priority = parameterUI.PrimaryGroup.Priority };
		newUi.SecondaryGroup = new() { Name = parameterUI.SecondaryGroup.Name, Priority = parameterUI.SecondaryGroup.Priority };

		return newUi;
	}

	internal static GenericParameterUI ConvertToGenericParameterUI( this VanillaGraph.ParameterUI parameterUI )
	{
		var newUi = new GenericParameterUI();

		newUi.Priority = parameterUI.Priority;
		newUi.PrimaryGroup = new() { Name = parameterUI.PrimaryGroup.Name, Priority = parameterUI.PrimaryGroup.Priority };
		newUi.SecondaryGroup = new() { Name = parameterUI.SecondaryGroup.Name, Priority = parameterUI.SecondaryGroup.Priority };

		return newUi;
	}
}


// TODO
/*
internal class FloatNodeConvert : BaseNodeConvert
{
	public override Type NodeTypeToConvert => typeof( VanillaNodes.Float );

	public override IEnumerable<BaseNodePlus> Convert( ProjectConverter converter, ShaderGraphBaseNode oldNode )
	{
		var newNodes = new List<BaseNodePlus>();
		var oldFloatNode = oldNode as VanillaNodes.Float;

		//SGPLog.Info( "Convert float node" );

		if ( string.IsNullOrWhiteSpace( oldFloatNode.Name ) )
		{
			var newConstantNode = new FloatConstantNode();
			newConstantNode.Value = oldFloatNode.Value;
			newConstantNode.Min = oldFloatNode.Min;
			newConstantNode.Max = oldFloatNode.Max;
			newConstantNode.Step = oldFloatNode.Step;

			newNodes.Add( newConstantNode );
		}
		else
		{
			var newNode = new FloatParameterNode
			{
				ParameterIdentifier = Guid.NewGuid(),
				Identifier = oldNode.Identifier,
				Position = oldNode.Position,
				Name = oldFloatNode.Name,
				Value = oldFloatNode.Value,
				Min = oldFloatNode.Min,
				Max = oldFloatNode.Max,
				IsAttribute = oldFloatNode.IsAttribute,
				UI = oldFloatNode.UI.ConvertVanillaUI()
			};

			BlackboardParameter blackboardParameter = new FloatParameter()
			{
				Identifier = newNode.ParameterIdentifier,
				Name = newNode.Name,
				Value = newNode.Value,
				Min = newNode.Min,
				Max = newNode.Max,
				UI = newNode.UI
			};

			converter.AddBlackboardParameter( blackboardParameter );

			newNodes.Add( newNode );
		}

		return newNodes;
	}
}

internal class Float2NodeConvert : BaseNodeConvert
{
	public override Type NodeTypeToConvert => typeof( VanillaNodes.Float2 );

	public override IEnumerable<BaseNodePlus> Convert( ProjectConverter converter, ShaderGraphBaseNode oldNode )
	{
		var newNodes = new List<BaseNodePlus>();
		var oldFloat2Node = oldNode as VanillaNodes.Float2;

		//SGPLog.Info( "Convert float2 node" );

		if ( string.IsNullOrWhiteSpace( oldFloat2Node.Name ) )
		{
			var newConstantNode = new Float2ConstantNode();
			newConstantNode.Value = oldFloat2Node.Value;
			newConstantNode.Min = oldFloat2Node.Min;
			newConstantNode.Max = oldFloat2Node.Max;
			newConstantNode.Step = oldFloat2Node.Step;

			newNodes.Add( newConstantNode );
		}
		else
		{
			var newNode = new Float2ParameterNode
			{
				ParameterIdentifier = Guid.NewGuid(),
				Identifier = oldNode.Identifier,
				Position = oldNode.Position,
				Name = oldFloat2Node.Name,
				Value = oldFloat2Node.Value,
				Min = oldFloat2Node.Min,
				Max = oldFloat2Node.Max,
				IsAttribute = oldFloat2Node.IsAttribute,
				UI = oldFloat2Node.UI.ConvertVanillaUI()
			};

			BlackboardParameter blackboardParameter = new Float2Parameter()
			{
				Identifier = newNode.ParameterIdentifier,
				Name = newNode.Name,
				Value = newNode.Value,
				Min = newNode.Min,
				Max = newNode.Max,
				UI = newNode.UI
			};

			converter.AddBlackboardParameter( blackboardParameter );

			newNodes.Add( newNode );
		}

		return newNodes;
	}
}

internal class Float3NodeConvert : BaseNodeConvert
{
	public override Type NodeTypeToConvert => typeof( VanillaNodes.Float3 );

	public override IEnumerable<BaseNodePlus> Convert( ProjectConverter converter, ShaderGraphBaseNode oldNode )
	{
		var newNodes = new List<BaseNodePlus>();
		var oldFloat3Node = oldNode as VanillaNodes.Float3;

		//SGPLog.Info( "Convert float3 node" );

		if ( string.IsNullOrWhiteSpace( oldFloat3Node.Name ) )
		{
			var newConstantNode = new Float3ConstantNode();
			newConstantNode.Value = oldFloat3Node.Value;
			newConstantNode.Min = oldFloat3Node.Min;
			newConstantNode.Max = oldFloat3Node.Max;
			newConstantNode.Step = oldFloat3Node.Step;

			newNodes.Add( newConstantNode );
		}
		else
		{
			var newNode = new Float3ParameterNode
			{
				ParameterIdentifier = Guid.NewGuid(),
				Identifier = oldNode.Identifier,
				Position = oldNode.Position,
				Name = oldFloat3Node.Name,
				Value = oldFloat3Node.Value,
				Min = oldFloat3Node.Min,
				Max = oldFloat3Node.Max,
				IsAttribute = oldFloat3Node.IsAttribute,
				UI = oldFloat3Node.UI.ConvertVanillaUI()
			};

			BlackboardParameter blackboardParameter = new Float3Parameter()
			{
				Identifier = newNode.ParameterIdentifier,
				Name = newNode.Name,
				Value = newNode.Value,
				Min = newNode.Min,
				Max = newNode.Max,
				UI = newNode.UI
			};

			converter.AddBlackboardParameter( blackboardParameter );

			newNodes.Add( newNode );
		}

		return newNodes;
	}
}

internal class Float4NodeConvert : BaseNodeConvert
{
	public override Type NodeTypeToConvert => typeof( VanillaNodes.Float4 );

	public override IEnumerable<BaseNodePlus> Convert( ProjectConverter converter, ShaderGraphBaseNode oldNode )
	{
		var newNodes = new List<BaseNodePlus>();
		var oldFloat4Node = oldNode as VanillaNodes.Float4;

		//SGPLog.Info( "Convert float4 node" );

		if ( string.IsNullOrWhiteSpace( oldFloat4Node.Name ) )
		{
			var newConstantNode = new ColorConstantNode();
			newConstantNode.Value = oldFloat4Node.Value;

			newNodes.Add( newConstantNode );
		}
		else
		{
			var parameterType = oldFloat4Node.UI.Type;

			if ( parameterType == VanillaGraph.UIType.Color )
			{
				var newNode = new ColorParameterNode
				{
					ParameterIdentifier = Guid.NewGuid(),
					Identifier = oldNode.Identifier,
					Position = oldNode.Position,
					Value = oldFloat4Node.Value,
					Name = oldFloat4Node.Name,
					IsAttribute = oldFloat4Node.IsAttribute,
					UI = oldFloat4Node.UI.ConvertToColorParameterUI()
				};

				BlackboardParameter blackboardParameter = new ColorParameter()
				{
					Identifier = newNode.ParameterIdentifier,
					Name = newNode.Name,
					Value = newNode.Value,
					UI = newNode.UI,
				};

				converter.AddBlackboardParameter( blackboardParameter );

				newNodes.Add( newNode );
			}
			else
			{
				var newNode = new Float4ParameterNode
				{
					ParameterIdentifier = Guid.NewGuid(),
					Identifier = oldNode.Identifier,
					Position = oldNode.Position,
					Value = oldFloat4Node.Value,
					Name = oldFloat4Node.Name,
					IsAttribute = oldFloat4Node.IsAttribute,
					UI = oldFloat4Node.UI.ConvertVanillaUI()
				};

				BlackboardParameter blackboardParameter = new Float4Parameter()
				{
					Identifier = newNode.ParameterIdentifier,
					Name = newNode.Name,
					Value = newNode.Value,
					UI = newNode.UI,
				};

				converter.AddBlackboardParameter( blackboardParameter );

				newNodes.Add( newNode );
			}
		}

		return newNodes;
	}
}
*/