
using UnityEditor;
using UnityEngine;
using Codice.Client.Common;
using System;
using System.Linq;
#if XR_INSTALLED
using UnityEditor.XR.Management;
using UnityEditor.XR.Management.Metadata;
using Unity.XR.Oculus;
using UnityEngine.XR.Management;
using UnityEngine.XR.OpenXR;
using UnityEngine.XR.OpenXR.Features;
using UnityEngine.XR.OpenXR.Features.Interactions;
#endif
public class XRSettingsConfigurator : Editor
{
    internal const string FIRST_TIME = "CONFI_UVR_XR"; // the key

    static XRSettingsConfigurator()
    {
        EditorApplication.update += CheckPackageInstallation;
        // EditorApplication.update += RunOnce;
        //EditorApplication.quitting += Quit;

    }

    private static void CheckPackageInstallation()
    {
        if (EditorPrefs.GetBool("XRPackagesInstalled", false))
        {
            // Ensure this runs only once after the package installation is confirmed
            EditorApplication.update -= CheckPackageInstallation;

            // Proceed with XRSettingsConfigurator initialization
            ConfigureXRSettings();
        }
    }

    [MenuItem("UtopiaVR/XR/Tests/PretendConfiQuit")]

    private static void Quit() => EditorPrefs.DeleteKey(FIRST_TIME);
    [MenuItem("UtopiaVR/XR/Tests/PretendConfiStart")]
    public static void RunOnce()
    {
        var firstTime = EditorPrefs.GetBool(FIRST_TIME, true);
        if (firstTime)
        {
            EditorPrefs.SetBool(FIRST_TIME, false);
            ConfigureXRSettings();
        }
        EditorApplication.update -= RunOnce;
    }

    [MenuItem("UtopiaVR/XR/Configure XR Settings")]
    [InitializeOnLoadMethod]
    public static void ConfigureXRSettings()
    {
#if XR_INSTALLED
#if XR_SETUP
            Debug.Log("ConfigureXRSettings ready setup");
#else
        if (EditorUtility.DisplayDialog("Reconfigure?","Do you want to reconfigure your XR project settings?", "Yes", "No"))
        {
            Debug.Log("ConfigureXRSettings");


            Debug.Log("ConfigureXRSettings XR_PLUGIN_MANAGEMENT is installed");

            // Assuming XR Plug-in Management is properly installed and set up in the project
            var xrGeneralSettings = XRGeneralSettings.Instance;
            if (xrGeneralSettings == null)
            {
                xrGeneralSettings = CreateInstance<XRGeneralSettings>();
                return;
            }
            //var WindowsSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(BuildTargetGroup.Standalone).Manager;
            //var AndroidSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(BuildTargetGroup.Android).Manager;

            XRGeneralSettingsPerBuildTarget buildTargetSettings = null;
            EditorBuildSettings.TryGetConfigObject(XRGeneralSettings.k_SettingsKey, out buildTargetSettings);
            XRGeneralSettings settingsS = buildTargetSettings.SettingsForBuildTarget(BuildTargetGroup.Standalone);
            XRGeneralSettings settingsA = buildTargetSettings.SettingsForBuildTarget(BuildTargetGroup.Android);

            XRPackageMetadataStore.AssignLoader(settingsS.Manager, "Unity.XR.OpenXR.OpenXRLoader", BuildTargetGroup.Standalone);
            XRPackageMetadataStore.AssignLoader(settingsA.Manager, "Unity.XR.OpenXR.OpenXRLoader", BuildTargetGroup.Android);
            EditorUtility.SetDirty(xrGeneralSettings);


            OpenXRSettings openXRSettingsS = OpenXRSettings.GetSettingsForBuildTargetGroup(BuildTargetGroup.Standalone);
            OpenXRSettings openXRSettingsA = OpenXRSettings.GetSettingsForBuildTargetGroup(BuildTargetGroup.Android);

            openXRSettingsS.renderMode = OpenXRSettings.RenderMode.SinglePassInstanced;
            openXRSettingsA.renderMode = OpenXRSettings.RenderMode.SinglePassInstanced;

            openXRSettingsS.depthSubmissionMode = OpenXRSettings.DepthSubmissionMode.None;
            openXRSettingsA.depthSubmissionMode = OpenXRSettings.DepthSubmissionMode.None;


            //Debug.Log("Open Xr Features");
            foreach (OpenXRFeature f in openXRSettingsS.GetFeatures())
            {
                f.enabled = false;
            }

            openXRSettingsS.GetFeature<ValveIndexControllerProfile>().enabled = true;
            openXRSettingsS.GetFeature<HPReverbG2ControllerProfile>().enabled = true;
            openXRSettingsS.GetFeature<OculusTouchControllerProfile>().enabled = true;

            //openXRSettingsS.enable

            openXRSettingsA.GetFeature<OculusTouchControllerProfile>().enabled = true;

            EditorUtility.SetDirty(OpenXRSettings.Instance);



            OculusSettings oculusSettings = null;
            EditorBuildSettings.TryGetConfigObject("Unity.XR.Oculus.Settings", out oculusSettings);

            oculusSettings.m_StereoRenderingModeAndroid = OculusSettings.StereoRenderingModeAndroid.Multiview;
            oculusSettings.LowOverheadMode = false;
            oculusSettings.OptimizeBufferDiscards = true;
            oculusSettings.PhaseSync = false;
            oculusSettings.SymmetricProjection = true;
            oculusSettings.SubsampledLayout = false;
            oculusSettings.FoveatedRenderingMethod = OculusSettings.FoveationMethod.FixedFoveatedRendering;
            oculusSettings.EnableTrackingOriginStageMode = false;
            oculusSettings.DepthSubmission = false;
            oculusSettings.LateLatching = false;
            oculusSettings.LateLatchingDebug = false;
            oculusSettings.SystemSplashScreen = null;

        //    oculusSettings.TargetQuest3 = true;
            oculusSettings.TargetQuest2 = true;
            oculusSettings.TargetQuestPro = false;

            EditorUtility.SetDirty(oculusSettings);


            //// Save the changes to the project settings
            AssetDatabase.SaveAssets();

            Debug.Log("XR Settings Configured Successfully");
            AddDefineSymbol("XR_SETUP", BuildTargetGroup.Standalone);
            AddDefineSymbol("XR_SETUP", BuildTargetGroup.Android);

        }
#endif
#else
        // Fallback code for when XR Plugin Management is not installed
        Debug.Log("Fallback code for when XR Plugin Management is not installed");
#endif

    }
    private static void AddDefineSymbol(string define, BuildTargetGroup targetGroup)
    {
        var definesString = PlayerSettings.GetScriptingDefineSymbolsForGroup(targetGroup);
        var allDefines = definesString.Split(';').ToList();
        if (!allDefines.Contains(define))
        {
            allDefines.Add(define);
            PlayerSettings.SetScriptingDefineSymbolsForGroup(
                targetGroup,
                string.Join(";", allDefines.ToArray()));
        }
    }
}

