namespace UnityEditor.ShaderGraph
{
    [GenerationAPI]
    internal static class FieldDependencies
    {
        public static DependencyCollection Varyings = new DependencyCollection
        {
            new FieldDependency(StructFields.Varyings.positionWS,                                  StructFields.Attributes.positionOS),
            new FieldDependency(StructFields.Varyings.normalWS,                                    StructFields.Attributes.normalOS),
            new FieldDependency(StructFields.Varyings.tangentWS,                                   StructFields.Attributes.tangentOS),
            new FieldDependency(StructFields.Varyings.texCoord0,                                   StructFields.Attributes.uv0),
            new FieldDependency(StructFields.Varyings.texCoord1,                                   StructFields.Attributes.uv1),
            new FieldDependency(StructFields.Varyings.texCoord2,                                   StructFields.Attributes.uv2),
            new FieldDependency(StructFields.Varyings.texCoord3,                                   StructFields.Attributes.uv3),
            new FieldDependency(StructFields.Varyings.color,                                       StructFields.Attributes.color),
            new FieldDependency(StructFields.Varyings.instanceID,                                  StructFields.Attributes.instanceID),
        };

        public static DependencyCollection VertexDescription = new DependencyCollection
        {
            new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceNormal,            StructFields.Attributes.normalOS),
            new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpaceNormal,             StructFields.Attributes.normalOS),
            new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpaceNormal,              StructFields.VertexDescriptionInputs.WorldSpaceNormal),

            new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceTangent,           StructFields.Attributes.tangentOS),
            new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpaceTangent,            StructFields.Attributes.tangentOS),
            new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpaceTangent,             StructFields.VertexDescriptionInputs.WorldSpaceTangent),

            new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceBiTangent,         StructFields.Attributes.normalOS),
            new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceBiTangent,         StructFields.Attributes.tangentOS),
            new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpaceBiTangent,          StructFields.VertexDescriptionInputs.ObjectSpaceBiTangent),
            new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpaceBiTangent,           StructFields.VertexDescriptionInputs.WorldSpaceBiTangent),

            new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpacePosition,          StructFields.Attributes.positionOS),
            new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpacePosition,           StructFields.Attributes.positionOS),
            new FieldDependency(StructFields.VertexDescriptionInputs.AbsoluteWorldSpacePosition,   StructFields.Attributes.positionOS),
            new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpacePosition,            StructFields.VertexDescriptionInputs.WorldSpacePosition),

            new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpaceViewDirection,      StructFields.VertexDescriptionInputs.WorldSpacePosition),
            new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceViewDirection,     StructFields.VertexDescriptionInputs.WorldSpaceViewDirection),
            new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpaceViewDirection,       StructFields.VertexDescriptionInputs.WorldSpaceViewDirection),
            new FieldDependency(StructFields.VertexDescriptionInputs.TangentSpaceViewDirection,    StructFields.VertexDescriptionInputs.WorldSpaceViewDirection),
            new FieldDependency(StructFields.VertexDescriptionInputs.TangentSpaceViewDirection,    StructFields.VertexDescriptionInputs.WorldSpaceTangent),
            new FieldDependency(StructFields.VertexDescriptionInputs.TangentSpaceViewDirection,    StructFields.VertexDescriptionInputs.WorldSpaceBiTangent),
            new FieldDependency(StructFields.VertexDescriptionInputs.TangentSpaceViewDirection,    StructFields.VertexDescriptionInputs.WorldSpaceNormal),

            new FieldDependency(StructFields.VertexDescriptionInputs.ScreenPosition,               StructFields.VertexDescriptionInputs.WorldSpacePosition),
            new FieldDependency(StructFields.VertexDescriptionInputs.uv0,                          StructFields.Attributes.uv0),
            new FieldDependency(StructFields.VertexDescriptionInputs.uv1,                          StructFields.Attributes.uv1),
            new FieldDependency(StructFields.VertexDescriptionInputs.uv2,                          StructFields.Attributes.uv2),
            new FieldDependency(StructFields.VertexDescriptionInputs.uv3,                          StructFields.Attributes.uv3),
            new FieldDependency(StructFields.VertexDescriptionInputs.VertexColor,                  StructFields.Attributes.color),

            new FieldDependency(StructFields.VertexDescriptionInputs.BoneWeights,                   StructFields.Attributes.weights),
            new FieldDependency(StructFields.VertexDescriptionInputs.BoneIndices,                   StructFields.Attributes.indices),
            new FieldDependency(StructFields.VertexDescriptionInputs.VertexID,                      StructFields.Attributes.vertexID),
        };

        public static DependencyCollection SurfaceDescription = new DependencyCollection
        {
            new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpaceNormal,             StructFields.Varyings.normalWS),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpaceNormal,            StructFields.SurfaceDescriptionInputs.WorldSpaceNormal),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpaceNormal,              StructFields.SurfaceDescriptionInputs.WorldSpaceNormal),

            new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpaceTangent,            StructFields.Varyings.tangentWS),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpaceTangent,            StructFields.SurfaceDescriptionInputs.WorldSpaceNormal),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpaceTangent,           StructFields.SurfaceDescriptionInputs.WorldSpaceTangent),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpaceTangent,             StructFields.SurfaceDescriptionInputs.WorldSpaceTangent),

            new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpaceBiTangent,          StructFields.SurfaceDescriptionInputs.WorldSpaceNormal),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpaceBiTangent,          StructFields.SurfaceDescriptionInputs.WorldSpaceTangent),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpaceBiTangent,         StructFields.SurfaceDescriptionInputs.WorldSpaceBiTangent),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpaceBiTangent,           StructFields.SurfaceDescriptionInputs.WorldSpaceBiTangent),

            new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpacePosition,           StructFields.Varyings.positionWS),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.AbsoluteWorldSpacePosition,   StructFields.Varyings.positionWS),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpacePosition,          StructFields.Varyings.positionWS),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpacePosition,            StructFields.Varyings.positionWS),

            new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpaceViewDirection,      StructFields.Varyings.viewDirectionWS),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpaceViewDirection,     StructFields.SurfaceDescriptionInputs.WorldSpaceViewDirection),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpaceViewDirection,       StructFields.SurfaceDescriptionInputs.WorldSpaceViewDirection),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.TangentSpaceViewDirection,    StructFields.SurfaceDescriptionInputs.WorldSpaceViewDirection),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.TangentSpaceViewDirection,    StructFields.SurfaceDescriptionInputs.WorldSpaceTangent),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.TangentSpaceViewDirection,    StructFields.SurfaceDescriptionInputs.WorldSpaceBiTangent),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.TangentSpaceViewDirection,    StructFields.SurfaceDescriptionInputs.WorldSpaceNormal),

            new FieldDependency(StructFields.SurfaceDescriptionInputs.ScreenPosition,               StructFields.SurfaceDescriptionInputs.WorldSpacePosition),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.uv0,                          StructFields.Varyings.texCoord0),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.uv1,                          StructFields.Varyings.texCoord1),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.uv2,                          StructFields.Varyings.texCoord2),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.uv3,                          StructFields.Varyings.texCoord3),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.VertexColor,                  StructFields.Varyings.color),
            new FieldDependency(StructFields.SurfaceDescriptionInputs.FaceSign,                     StructFields.Varyings.cullFace),
        };

        public static DependencyCollection Default = new DependencyCollection
        {
            { Varyings },
            { VertexDescription },
            { SurfaceDescription },
        };
    }
}
