#if UNITY_2022_2_OR_NEWER
using System;
#endif
using UnityEditor.Build;
using UnityEngine;

namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol
{
    internal static class UtpMessageBuilder
    {
        internal static ScreenSettingsMessage BuildScreenSettings()
        {
#if UNITY_2022_2_OR_NEWER
            // casting to int and rounding to ensure backwards compatibility with older package versions
            var screenRefreshRate = (int)Math.Round(Screen.currentResolution.refreshRateRatio.value);
#else
            var screenRefreshRate = Screen.currentResolution.refreshRate;
#endif

            var screenSettingsMessage = new ScreenSettingsMessage()
            {
                ScreenSettings = new ScreenSettings(Screen.currentResolution.width, Screen.currentResolution.height, screenRefreshRate, Screen.fullScreen)
            };

            return screenSettingsMessage;
        }

        public static QualitySettingsMessage BuildQualitySettings()
        {
            var qualitySettingsMessage = new QualitySettingsMessage()
            {
                QualitySettings = new QualitySettings(
                    UnityEngine.QualitySettings.vSyncCount,
                    UnityEngine.QualitySettings.antiAliasing,
                    UnityEngine.QualitySettings.activeColorSpace.ToString(),
                    UnityEngine.QualitySettings.anisotropicFiltering.ToString(),
                    UnityEngine.QualitySettings.skinWeights.ToString()
                ),
            };
            return qualitySettingsMessage;
        }

        internal static PlayerSystemInfoMessage BuildPlayerSystemInfo()
        {
            var xrDevice = string.Empty;
            var XrModel = string.Empty;
#if ENABLE_XR
            xrDevice = UnityEngine.XR.XRSettings.loadedDeviceName;
            XrModel = UnityEngine.XR.XRDevice.model;
#endif

            var playerSystemInfoMessage = new PlayerSystemInfoMessage()
            {
                PlayerSystemInfo = new PlayerSystemInfo(
                    SystemInfo.operatingSystem,
                    SystemInfo.deviceModel,
                    SystemInfo.deviceName,
                    SystemInfo.processorType,
                    SystemInfo.processorCount,
                    SystemInfo.graphicsDeviceName,
                    SystemInfo.systemMemorySize,
                    XrModel,
                    xrDevice
                ),
            };
            return playerSystemInfoMessage;
        }

        internal static PlayerSettingsMessage BuildPlayerSettings()
        {
            var scriptingBackend = string.Empty;
#if UNITY_2021_2_OR_NEWER
            scriptingBackend =
                UnityEditor.PlayerSettings.GetScriptingBackend(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.selectedBuildTargetGroup)).ToString();
#else
            scriptingBackend = UnityEditor.PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup).ToString();
#endif

            var playerSettingsMessage = new PlayerSettingsMessage()
            {
                PlayerSettings = new PlayerSettings(
                    scriptingBackend,
                    UnityEditor.PlayerSettings.gpuSkinning,
                    string.Empty,
                    UnityEditorInternal.InternalEditorUtility.inBatchMode.ToString(),
                    UnityEditor.PlayerSettings.stereoRenderingPath.ToString(),
                    UnityEditor.PlayerSettings.graphicsJobs ? "GraphicsJobs" : UnityEditor.PlayerSettings.MTRendering ? "MultiThreaded" : "SingleThreaded",
                    UnityEditor.PlayerSettings.Android.targetSdkVersion.ToString(),
                    UnityEditor.PlayerSettings.Android.minSdkVersion.ToString(),
                    UnityEditor.PlayerSettings.graphicsJobs,
                    UnityEditor.PlayerSettings.MTRendering
                ),
            };

            return playerSettingsMessage;
        }

        internal static BuildSettingsMessage BuildBuildSettings()
        {
            var buildSettingsMessage = new BuildSettingsMessage()
            {
                BuildSettings = new BuildSettings(
                    Application.platform.ToString(),
                    EditorUserBuildSettings.activeBuildTarget.ToString(),
                    EditorUserBuildSettings.development,
                    EditorUserBuildSettings.androidBuildSystem.ToString()
                )
            };

            return buildSettingsMessage;
        }
    }
}