using System.IO;
using Alibabacloud.Rum.Unity.Logs;
using Alibabacloud.Rum.Unity.Rum;
using UnityEditor;
using UnityEngine;

namespace Alibabacloud.Rum.Unity.Editor
{
    /// <summary>
    /// Extension methods for AlibabacloudOptions to support Editor-time creation and loading.
    /// </summary>
    public static class AlibabacloudOptionsExtensions
    {
        /// <summary>
        /// Gets existing AlibabacloudOptions or creates a new one with default values.
        /// </summary>
        /// <param name="settingsPath">Optional custom path. If null, uses default path.</param>
        /// <returns>AlibabacloudOptions instance</returns>
        public static AlibabacloudOptions GetOrCreate(string settingsPath = null)
        {
            settingsPath ??= AlibabacloudOptions.GetConfigPath();
            
            var options = AssetDatabase.LoadAssetAtPath<AlibabacloudOptions>(settingsPath);
            if (options == null)
            {
                var directory = Path.GetDirectoryName(settingsPath);
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                options = ScriptableObject.CreateInstance<AlibabacloudOptions>();

                // Base Configuration
                options.Enabled = true;
                options.Endpoint = string.Empty;
                options.ServiceId = string.Empty;
                options.Workspace = string.Empty;
                options.EnableNativeSDKLogDebug = true;

                // Debug Configuration
                options.Debug = true;
                options.DiagnosticLevel = AlibabacloudLogLevel.Warning;

                // Trace Configuration
                options.TracesSampleRate = 0.0;
                options.AutoStartupTraces = true;
                options.AutoSceneLoadTraces = true;
                options.AutoAwakeTraces = false;

                // Session Configuration
                options.AutoSessionTracking = true;
                options.AutoSessionTrackingInterval = 30000; // 30 seconds

                // Log Debouncing Configuration
                options.EnableLogDebouncing = false;
                options.DebounceTimeLog = 1000;
                options.DebounceTimeWarning = 1000;
                options.DebounceTimeError = 1000;

                // Attachment Configuration
                options.AttachStacktrace = false;
                options.AttachScreenshot = false;
                options.ScreenshotCompression = 75;
                options.AttachViewHierarchy = false;
                options.MaxViewHierarchyRootObjects = 100;
                options.MaxViewHierarchyObjectChildCount = 20;
                options.MaxViewHierarchyDepth = 10;

                // Structured Logging Configuration
                options.EnableStructuredLogging = false;
                options.StructuredLogOnDebugLog = false;
                options.StructuredLogOnDebugLogWarning = true;
                options.StructuredLogOnDebugLogAssertion = true;
                options.StructuredLogOnDebugLogError = true;
                options.StructuredLogOnDebugLogException = true;

                // Network Tracking Configuration
                options.EnableNetworkTracking = true;
                options.NetworkSampleRate = 1.0;
                options.NetworkUrlAllowlist = System.Array.Empty<string>();
                options.NetworkUrlBlocklist = System.Array.Empty<string>();
                options.CaptureRequestBodySize = true;
                options.CaptureResponseBodySize = true;
                options.CaptureRequestHeaders = false;
                options.CaptureResponseHeaders = false;
                options.NetworkRequestHeaderAllowlist = System.Array.Empty<string>();
                options.NetworkRequestHeaderBlocklist = System.Array.Empty<string>();
                options.NetworkResponseHeaderAllowlist = System.Array.Empty<string>();
                options.NetworkResponseHeaderBlocklist = System.Array.Empty<string>();
                options.NetworkStatusCodeRanges = System.Array.Empty<string>();

                // HTTP Method Tracking (all disabled by default means track all)
                options.TrackHttpGet = false;
                options.TrackHttpPost = false;
                options.TrackHttpPut = false;
                options.TrackHttpDelete = false;
                options.TrackHttpPatch = false;
                options.TrackHttpHead = false;
                options.TrackHttpOptions = false;

                // Trace Context Configuration
                options.EnableTraceContext = false;
                options.TraceContextConfigs = System.Array.Empty<TraceContextConfig>();

                // Symbol Files Configuration
                options.Il2CppLineNumberSupportEnabled = true;
                options.OutputSymbols = false;
                options.UploadSymbolsAfterBuild = false;
                options.SymbolUploadEndpoint = string.Empty;
                options.SymbolUploadApiKey = string.Empty;

                // Release and Environment Overrides
                options.ReleaseOverride = string.Empty;
                options.EnvironmentOverride = string.Empty;

                AssetDatabase.CreateAsset(options, settingsPath);
                AssetDatabase.SaveAssets();
                
                Debug.Log($"[ALIBABACLOUD] Created new AlibabacloudOptions at: {settingsPath}");
            }

            return options;
        }
        
        /// <summary>
        /// Loads existing AlibabacloudOptions without creating if not found.
        /// </summary>
        /// <param name="settingsPath">Optional custom path. If null, uses default path.</param>
        /// <returns>AlibabacloudOptions instance or null if not found</returns>
        public static AlibabacloudOptions Load(string settingsPath = null)
        {
            settingsPath ??= AlibabacloudOptions.GetConfigPath();
            return AssetDatabase.LoadAssetAtPath<AlibabacloudOptions>(settingsPath);
        }
    }
}
