using UnityEditor.ShaderGraph;
using UnityEngine;
using static UnityEditor.Rendering.BuiltIn.ShaderUtils;
using UnityEditor.Rendering.BuiltIn;
using System;
using UnityEditor.ShaderGraph.Serialization;
using UnityEngine.Rendering;
using BlendMode = UnityEngine.Rendering.BlendMode;
using BlendOp = UnityEditor.ShaderGraph.BlendOp;

namespace UnityEditor.Rendering.Fullscreen.ShaderGraph
{
    internal class FullscreenData : JsonObject
    {
        public enum Version
        {
            Initial,
        }

        [SerializeField]
        Version m_Version = Version.Initial;
        public Version version
        {
            get => m_Version;
            set => m_Version = value;
        }

        [SerializeField]
        FullscreenMode m_fullscreenMode;
        public FullscreenMode fullscreenMode
        {
            get => m_fullscreenMode;
            set => m_fullscreenMode = value;
        }

        [SerializeField]
        FullscreenBlendMode m_BlendMode = FullscreenBlendMode.Disabled;
        public FullscreenBlendMode blendMode
        {
            get => m_BlendMode;
            set => m_BlendMode = value;
        }

        [SerializeField]
        BlendMode m_SrcColorBlendMode = BlendMode.Zero;
        public BlendMode srcColorBlendMode
        {
            get => m_SrcColorBlendMode;
            set => m_SrcColorBlendMode = value;
        }

        [SerializeField]
        BlendMode m_DstColorBlendMode = BlendMode.One;
        public BlendMode dstColorBlendMode
        {
            get => m_DstColorBlendMode;
            set => m_DstColorBlendMode = value;
        }

        [SerializeField]
        BlendOp m_ColorBlendOperation = BlendOp.Add;
        public BlendOp colorBlendOperation
        {
            get => m_ColorBlendOperation;
            set => m_ColorBlendOperation = value;
        }

        [SerializeField]
        BlendMode m_SrcAlphaBlendMode = BlendMode.Zero;
        public BlendMode srcAlphaBlendMode
        {
            get => m_SrcAlphaBlendMode;
            set => m_SrcAlphaBlendMode = value;
        }

        [SerializeField]
        BlendMode m_DstAlphaBlendMode = BlendMode.One;
        public BlendMode dstAlphaBlendMode
        {
            get => m_DstAlphaBlendMode;
            set => m_DstAlphaBlendMode = value;
        }

        [SerializeField]
        BlendOp m_AlphaBlendOperation = BlendOp.Add;
        public BlendOp alphaBlendOperation
        {
            get => m_AlphaBlendOperation;
            set => m_AlphaBlendOperation = value;
        }

        [SerializeField]
        bool m_EnableStencil = false;
        public bool enableStencil
        {
            get => m_EnableStencil;
            set => m_EnableStencil = value;
        }

        [SerializeField]
        int m_StencilReference = 0;
        public int stencilReference
        {
            get => m_StencilReference;
            set => m_StencilReference = Mathf.Clamp(value, 0, 255);
        }

        [SerializeField]
        int m_StencilReadMask = 255;
        public int stencilReadMask
        {
            get => m_StencilReadMask;
            set => m_StencilReadMask = Mathf.Clamp(value, 0, 255);
        }

        [SerializeField]
        int m_StencilWriteMask = 255;
        public int stencilWriteMask
        {
            get => m_StencilWriteMask;
            set => m_StencilWriteMask = Mathf.Clamp(value, 0, 255);
        }

        [SerializeField]
        CompareFunction m_StencilCompareFunction = CompareFunction.Always;
        public CompareFunction stencilCompareFunction
        {
            get => m_StencilCompareFunction;
            set => m_StencilCompareFunction = value;
        }

        [SerializeField]
        StencilOp m_StencilPassOperation = StencilOp.Keep;
        public StencilOp stencilPassOperation
        {
            get => m_StencilPassOperation;
            set => m_StencilPassOperation = value;
        }

        [SerializeField]
        StencilOp m_StencilFailOperation = StencilOp.Keep;
        public StencilOp stencilFailOperation
        {
            get => m_StencilFailOperation;
            set => m_StencilFailOperation = value;
        }

        [SerializeField]
        StencilOp m_StencilDepthFailOperation = StencilOp.Keep;
        public StencilOp stencilDepthTestFailOperation
        {
            get => m_StencilDepthFailOperation;
            set => m_StencilDepthFailOperation = value;
        }

        [SerializeField]
        bool m_DepthWrite = false;
        public bool depthWrite
        {
            get => m_DepthWrite;
            set => m_DepthWrite = value;
        }

        [SerializeField]
        FullscreenDepthWriteMode m_depthWriteMode = FullscreenDepthWriteMode.LinearEye;
        public FullscreenDepthWriteMode depthWriteMode
        {
            get => m_depthWriteMode;
            set => m_depthWriteMode = value;
        }

        // When checked, allows the material to control ALL surface settings (uber shader style)
        [SerializeField]
        bool m_AllowMaterialOverride = false;
        public bool allowMaterialOverride
        {
            get => m_AllowMaterialOverride;
            set => m_AllowMaterialOverride = value;
        }

        [SerializeField]
        CompareFunction m_DepthTestMode = CompareFunction.Disabled;
        public CompareFunction depthTestMode
        {
            get => m_DepthTestMode;
            set => m_DepthTestMode = value;
        }
    }
}