using System;
using UnityEditor.AddressableAssets.Diagnostics.Data;
using UnityEngine;

namespace UnityEditor.AddressableAssets.Diagnostics.GUI.Graph
{
    class GraphLayerBackgroundGraph : GraphLayerBase
    {
        bool IsContinuationOfSegment(int prevData, int nextData)
        {
            return (prevData == 0 != (nextData == 0));
        }

        Color m_LoadColor;
        int m_LoadStatusStream;

        internal GraphLayerBackgroundGraph(int refCountStream, Color refBgColor, int loadStatusStream, Color loadStatusColor, string name, string desc) : base(refCountStream, name, desc, refBgColor)
        {
            m_LoadColor = loadStatusColor;
            m_LoadStatusStream = loadStatusStream;
        }

        public override void Draw(EventDataSet dataSet, Rect rect, int startFrame, int frameCount, int inspectFrame, bool expanded, Material material, int maxValue)
        {
            if (dataSet == null)
                return;

            int endFrame = startFrame + frameCount;

            EventDataSetStream refStream = dataSet.GetStream(Stream);
            if (refStream != null)
            {
                foreach (GraphUtility.Segment s in GraphUtility.IterateSegments(refStream, startFrame, endFrame, IsContinuationOfSegment))
                {
                    if (s.data != 0)
                    {
                        float x = rect.xMin + GraphUtility.ValueToPixel(s.frameStart, startFrame, endFrame, rect.width);
                        float w = (rect.xMin + GraphUtility.ValueToPixel(s.frameEnd, startFrame, endFrame, rect.width)) - x;
                        EditorGUI.DrawRect(new Rect(x, rect.yMin, w, rect.height), GraphColor);
                    }
                }
            }

            EventDataSetStream loadStream = dataSet.GetStream(m_LoadStatusStream);
            if (loadStream != null)
            {
                foreach (GraphUtility.Segment s in GraphUtility.IterateSegments(loadStream, startFrame, endFrame, IsContinuationOfSegment))
                {
                    if (s.data == 0)
                    {
                        float x = rect.xMin + GraphUtility.ValueToPixel(s.frameStart, startFrame, endFrame, rect.width);
                        float w = (rect.xMin + GraphUtility.ValueToPixel(s.frameEnd, startFrame, endFrame, rect.width)) - x;
                        EditorGUI.DrawRect(new Rect(x, rect.yMin, w, rect.height), m_LoadColor);
                    }
                }
            }
        }
    }
}