using JetBrains.Annotations;
using System;
using System.Diagnostics.CodeAnalysis;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
using UnityEngine.Analytics;
using UnityEngine.Rendering;

namespace UnityEditor.Rendering.Analytics
{
    internal class BuildTargetAnalytic : IPostprocessBuildWithReport
    {
        public int callbackOrder => int.MaxValue;

        [AnalyticInfo(eventName: "uBuildTargetAnalytic", vendorKey: "unity.srp", maxEventsPerHour: 10, maxNumberOfElements: 1000)]
        internal class Analytic : IAnalytic
        {

            [MustUseReturnValue]
            public bool TryGatherData([NotNullWhen(true)] out IAnalytic.IData data, [NotNullWhen(false)] out Exception error)
            {
                var activeBuildTarget = EditorUserBuildSettings.activeBuildTarget;
                var activeBuildTargetGroup = BuildPipeline.GetBuildTargetGroup(activeBuildTarget);
                var activeBuildTargetGroupName = NamedBuildTarget.FromBuildTargetGroup(activeBuildTargetGroup).TargetName;

                error = null;

                var assetType = GraphicsSettings.currentRenderPipeline == null ? "Built-In Render Pipeline" : GraphicsSettings.currentRenderPipeline.GetType().ToString();

                data = new BuildTargetAnalyticData()
                {
                    build_target = activeBuildTarget.ToString(),
                    quality_levels = QualitySettings.GetActiveQualityLevelsForPlatformCount(activeBuildTargetGroupName),
                    render_pipeline_asset_type = assetType,
                    total_quality_levels_on_project = QualitySettings.count
                };
                return true;
            }
        };

        [System.Diagnostics.DebuggerDisplay("{render_pipeline_asset_type} - {quality_levels}/{total_quality_levels_on_project}")]
        [Serializable]
        internal struct BuildTargetAnalyticData : IAnalytic.IData
        {
            // Naming convention for analytics data
            public string build_target;
            public string render_pipeline_asset_type;
            public int quality_levels;
            public int total_quality_levels_on_project;
        };

        void IPostprocessBuildWithReport.OnPostprocessBuild(BuildReport _)
        {
            SendAnalytic();
        }

        [MenuItem("internal:Edit/Rendering/Analytics/Send BuildTargetAnalytic ", priority = 0)]
        static void SendAnalytic()
        {
            Analytic analytic = new Analytic();
            EditorAnalytics.SendAnalytic(analytic);
        }
    }

}