using System;
using System.Runtime.InteropServices;
using Alibabacloud.Rum.Unity.Rum;
using Alibabacloud.Rum.Unity.Worker;
using Alibabacloud.Rum.Unity;
using Alibabacloud.Rum.Unity.Logs;
using UnityEngine;
using UnityEngine.Scripting;

[assembly: UnityEngine.Scripting.Preserve]
[assembly: UnityEngine.Scripting.AlwaysLinkAssembly]

namespace Alibabacloud.Rum.Unity.WebGL
{
   
    [Preserve]
    public static class AlibabacloudInitialization
    {
        [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
        public static void InitializeAlibabacloud()
        {
            var options = AlibabacloudOptions.LoadAlibabacloudUnityOptions();
            if (options != null && options.Enabled)
            {
                var webGLPlatform = new WebGLPlatform();
                webGLPlatform.Init(options);
                AlibabacloudSdk.InitWithPlatform(webGLPlatform, options);
            }
        }
    }
    
    public class WebGLPlatform : IAlibabacloudPlatform
    {
        #region DllImport Declarations
        
        [DllImport("__Internal")]
        private static extern void AlibabacloudRum_Init(string jsonConfiguration);
        
        [DllImport("__Internal")]
        private static extern void AlibabacloudRum_SetConfig(string key, string value);
        
        [DllImport("__Internal")]
        private static extern void AlibabacloudRum_SetUser(string userId, string userName, string tags);
        
        #endregion
        
        public void Init(AlibabacloudOptions options)
        {
            if (options == null)
            {
                return;
            }
            
            try
            {
                // Construct the full endpoint URL for Browser SDK
                // Format: {baseUrl}/rum/web/v2?workspace={workspace}&service_id={serviceId}
                string baseUrl = options.Endpoint ?? string.Empty;
                string workspace = options.Workspace ?? string.Empty;
                string serviceId = options.ServiceId ?? string.Empty;
                
                string fullEndpoint = BuildBrowserSdkEndpoint(baseUrl, workspace, serviceId);
                
                // Build configuration for Browser SDK
                var config = new WebGLRumConfig
                {
                    enable = options.Enabled,
                    endpoint = fullEndpoint,
                    pid = serviceId,
                    env = options.EnvironmentOverride ?? "prod",
                    version = Application.version,
                    app = new WebGLAppConfig
                    {
                        name = Application.productName,
                        version = Application.version,
                        type = AlibabacloudCommonParam.ScreenType
                    }
                };
                
                string jsonConfig = JsonUtility.ToJson(config);
                
                AlibabacloudRum_Init(jsonConfig);
            }
            catch (Exception e)
            {
                options.LogError("WebGL initialization failed: {0}\n{1}", e.Message, e.StackTrace);
            }
        }
        
        /// <summary>
        /// Build the full Browser SDK endpoint URL.
        /// Format: {baseUrl}/rum/web/v2?workspace={workspace}&service_id={serviceId}
        /// </summary>
        private static string BuildBrowserSdkEndpoint(string baseUrl, string workspace, string serviceId)
        {
            if (string.IsNullOrEmpty(baseUrl))
            {
                return string.Empty;
            }
            
            // Remove trailing slash from base URL if present
            baseUrl = baseUrl.TrimEnd('/');
            
            // Build full endpoint
            var sb = new System.Text.StringBuilder();
            sb.Append(baseUrl);
            sb.Append("/rum/web/v2?");
            
            bool hasQuery = false;
            
            if (!string.IsNullOrEmpty(workspace))
            {
                sb.Append("workspace=");
                sb.Append(Uri.EscapeDataString(workspace));
                hasQuery = true;
            }
            
            if (!string.IsNullOrEmpty(serviceId))
            {
                if (hasQuery)
                {
                    sb.Append("&");
                }
                sb.Append("service_id=");
                sb.Append(Uri.EscapeDataString(serviceId));
            }
            
            return sb.ToString();
        }

        public AlibabacloudWorker CreateWorker()
        {
            return new ThreadedWorker();
        }

        public IAlibabacloudRum InitRum(AlibabacloudOptions options)
        {
            var rum = new WebGLRum(options);
            return rum;
        }
    }
    
    #region Configuration Classes
    
    [Serializable]
    internal class WebGLRumConfig
    {
        public bool enable;
        public string endpoint;
        public string pid;
        public string env;
        public string version;
        public WebGLAppConfig app;
    }
    
    [Serializable]
    internal class WebGLAppConfig
    {
        public string name;
        public string version;
        public string type;
    }
    
    #endregion
}