using System;
using System.Reflection;
using UnityEngine.Rendering.RenderGraphModule;
using NameAndTooltip = UnityEngine.Rendering.DebugUI.Widget.NameAndTooltip;

namespace UnityEngine.Rendering
{
    /// <summary>
    /// Render Graph-related Rendering Debugger settings.
    /// </summary>
    [PipelineHelpURL("UniversalRenderPipelineAsset", pageName: "features/rendering-debugger-reference", pageHash: "render-graph")]
    [PipelineHelpURL("HDRenderPipelineAsset", pageName: "rendering-debugger-window-reference", pageHash: "render-graph")]
    class DebugDisplaySettingsRenderGraph : IDebugDisplaySettingsData
    {
        public DebugDisplaySettingsRenderGraph()
        {
            foreach (var graph in RenderGraph.GetRegisteredRenderGraphs())
            {
                graph.debugParams.Reset();
            }
        }

        [DisplayInfo(name = "Rendering", order = 10)]
        private class SettingsPanel : DebugDisplaySettingsPanel
        {
            public SettingsPanel(DebugDisplaySettingsRenderGraph _)
            {
                DocumentationUtils.TryGetHelpURL(typeof(DebugDisplaySettingsRenderGraph), out var documentationUrl);
                var foldout = new DebugUI.Foldout()
                {
                    displayName = "Render Graph",
                    documentationUrl = documentationUrl
                };
                AddWidget(foldout);

                bool usingRenderGraph = false;
                foreach (var graph in RenderGraph.GetRegisteredRenderGraphs())
                {
                    usingRenderGraph = true;
                    var list = graph.GetWidgetList();
                    foreach (var item in list)
                        foldout.children.Add(item);
                }

                if (!usingRenderGraph)
                {
                    foldout.children.Add(new DebugUI.MessageBox()
                    {
                        displayName =
                            "Warning: The current render pipeline does not have Render Graphs Registered",
                        style = DebugUI.MessageBox.Style.Warning
                    });
                }
            }
        }

        #region IDebugDisplaySettingsQuery

        /// <inheritdoc/>
        IDebugDisplaySettingsPanelDisposable IDebugDisplaySettingsData.CreatePanel()
        {
            return new SettingsPanel(this);
        }

        public bool AreAnySettingsActive
        {
            get
            {
                foreach (var (graph, _) in RenderGraph.GetRegisteredExecutions())
                {
                    if (graph.areAnySettingsActive)
                        return true;
                }

                return false;
            }
        }

        #endregion
    }
}