Editor/ShaderGraphPlus/ProjectConverter/Nodes/UnaryConvert.cs
using Editor;
using ShaderGraphPlus.Nodes;
using VanillaGraph = Editor.ShaderGraph;
using VanillaNodes = Editor.ShaderGraph.Nodes;
using ShaderGraphBaseNode = Editor.ShaderGraph.BaseNode;

namespace ShaderGraphPlus.Internal;

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

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

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

		var newNode = new Cosine();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Abs();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new DotProduct();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new DDX();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.Precision = oldDDXNode.Precision switch
		{
			VanillaNodes.DerivativePrecision.Standard => DerivativePrecision.Standard,
			VanillaNodes.DerivativePrecision.Course => DerivativePrecision.Course,
			VanillaNodes.DerivativePrecision.Fine => DerivativePrecision.Fine,
			_ => throw new NotImplementedException(),
		};

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new DDY();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.Precision = oldDDYNode.Precision switch
		{
			VanillaNodes.DerivativePrecision.Standard => DerivativePrecision.Standard,
			VanillaNodes.DerivativePrecision.Course => DerivativePrecision.Course,
			VanillaNodes.DerivativePrecision.Fine => DerivativePrecision.Fine,
			_ => throw new NotImplementedException(),
		};

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new DDXY();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Exponential();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.Base = oldExponentialNode.Base switch
		{
			VanillaNodes.ExponentBase.BaseE => ExponentBase.BaseE,
			VanillaNodes.ExponentBase.Base2 => ExponentBase.Base2,
			_ => throw new NotImplementedException(),
		};

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Frac();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Floor();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Length();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new BaseLog();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.Base = oldBaseLogNode.Base switch
		{
			VanillaNodes.LogBase.BaseE => LogBase.BaseE,
			VanillaNodes.LogBase.Base2 => LogBase.Base2,
			VanillaNodes.LogBase.Base10 => LogBase.Base10,
			_ => throw new NotImplementedException(),
		};

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Min();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldMinNode.DefaultA;
		newNode.DefaultB = oldMinNode.DefaultB;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Max();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldMaxNode.DefaultA;
		newNode.DefaultB = oldMaxNode.DefaultB;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Saturate();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Sine();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Step();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultInput = oldStepNode.DefaultInput;
		newNode.DefaultEdge = oldStepNode.DefaultEdge;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new SmoothStep();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultInput = oldSmoothStepNode.DefaultInput;
		newNode.DefaultEdge1 = oldSmoothStepNode.DefaultEdge1;
		newNode.DefaultEdge2 = oldSmoothStepNode.DefaultEdge2;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Tan();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Arcsin();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Arccos();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Round();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Ceil();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new OneMinus();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Sqrt();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Distance();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}