using System;
using UnityEngine;
using UnityEngine.Analytics;
using UnityEngine.Rendering.Universal;
using static UnityEngine.Analytics.IAnalytic;

namespace UnityEditor.Rendering.Universal.Analytics
{
    struct AnalyticsDataTypes
    {
        public const string k_LightDataString = "u2drendererlights";
        public const string k_Renderer2DDataString = "u2drendererdata";
        public const int k_MaxEventsPerHour = 1000;
        public const int k_MaxNumberOfElements = 1000;
        public const string k_VendorKey = "unity.renderpipelines.universal.editor";
        public const int k_Version = 1;
    }

    [AnalyticInfo(eventName: AnalyticsDataTypes.k_LightDataString, vendorKey: AnalyticsDataTypes.k_VendorKey, maxEventsPerHour: AnalyticsDataTypes.k_MaxEventsPerHour, maxNumberOfElements: AnalyticsDataTypes.k_MaxNumberOfElements)]
    internal class LightDataAnalytic : IAnalytic
    {
        public LightDataAnalytic(int instance_id, bool was_create_event, Light2D.LightType light_type)
        {
            m_Data = new Light2DData
            {
                instance_id = instance_id,
                was_create_event = was_create_event,
                light_type = light_type
            };
        }

        [Serializable]
        internal struct Light2DData : IAnalytic.IData
        {
            [SerializeField]
            public bool was_create_event;
            [SerializeField]
            public int instance_id;
            [SerializeField]
            public Light2D.LightType light_type;
        };
        public bool TryGatherData(out IAnalytic.IData data, out Exception error)
        {
            data = m_Data;
            error = null;
            return true;
        }
        Light2DData m_Data;
    }

    [AnalyticInfo(eventName: AnalyticsDataTypes.k_Renderer2DDataString, vendorKey: AnalyticsDataTypes.k_VendorKey, maxEventsPerHour: AnalyticsDataTypes.k_MaxEventsPerHour, maxNumberOfElements: AnalyticsDataTypes.k_MaxNumberOfElements)]
    internal class RenderAssetAnalytic : IAnalytic
    {
        public RenderAssetAnalytic(int instance_id, bool was_create_event, int blending_layers_count, int blending_modes_used)
        {
            m_Data = new RendererAssetData
            {
                instance_id = instance_id,
                was_create_event = was_create_event,
                blending_layers_count = blending_layers_count,
                blending_modes_used = blending_modes_used
            };
        }

        [Serializable]
        internal struct RendererAssetData : IAnalytic.IData
        {
            [SerializeField]
            public bool was_create_event;
            [SerializeField]
            public int instance_id;
            [SerializeField]
            public int blending_layers_count;
            [SerializeField]
            public int blending_modes_used;
        }
        public bool TryGatherData(out IAnalytic.IData data, out Exception error)
        {
            data = m_Data;
            error = null;
            return true;
        }
        RendererAssetData m_Data;

    }

    interface IAnalytics
    {
        AnalyticsResult SendData(IAnalytic analytic);
    }

    [InitializeOnLoad]
    internal class Renderer2DAnalytics : IAnalytics
    {
        static Renderer2DAnalytics m_Instance = new Renderer2DAnalytics();
        public static Renderer2DAnalytics instance
        {
            get
            {
                if (m_Instance == null)
                    m_Instance = new Renderer2DAnalytics();

                return m_Instance;
            }
        }

        public AnalyticsResult SendData(IAnalytic analytic)
        {
            return EditorAnalytics.SendAnalytic(analytic);
        }
    }
}