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

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

namespace Alibabacloud.Rum.Unity.iOS
{
    [Preserve]
    public static class AlibabacloudInitialization
    {
        [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
        public static void InitializeAlibabacloud()
        {
            var options = AlibabacloudOptions.LoadAlibabacloudUnityOptions();
            if (options != null && options.Enabled)
            {
                var iosPlatform = new IOSPlatform();
                iosPlatform.Init(options);
                AlibabacloudSdk.InitWithPlatform(iosPlatform, options);
            }
        }
    }

    public class IOSPlatform : IAlibabacloudPlatform
    {
        // P/Invoke declarations for iOS native methods
        #region P/Invoke Declarations
        
        [DllImport("__Internal")]
        private static extern void AlibabaCloudRUMSDK_setDebuggable(bool debuggable);
        
        [DllImport("__Internal")]
        private static extern bool AlibabaCloudRUMSDK_start(string configAddress, string workspace, string serviceId);
        
        [DllImport("__Internal")]
        private static extern bool AlibabaCloudRUMSDK_stop();
        
        [DllImport("__Internal")]
        private static extern bool AlibabaCloudRUMSDK_isStarted();
        
        [DllImport("__Internal")]
        private static extern void AlibabaCloudRUMSDK_setEnvironment(string env);
        
        [DllImport("__Internal")]
        private static extern void AlibabaCloudRUMSDK_setAppName(string name);
        
        [DllImport("__Internal")]
        private static extern void AlibabaCloudRUMSDK_setAppVersion(string version);
        
        [DllImport("__Internal")]
        private static extern void AlibabaCloudRUMSDK_setChannel(string channel);
        
        [DllImport("__Internal")]
        private static extern void AlibabaCloudRUMSDK_setUserId(string userId);
        
        [DllImport("__Internal")]
        private static extern void AlibabaCloudRUMSDK_setUserName(string userName);
        
        [DllImport("__Internal")]
        private static extern string AlibabaCloudRUMSDK_deviceId();
        
        #endregion
        
        private bool _isInitialized;

        public void Init(AlibabacloudOptions options)
        {
            if (_isInitialized)
            {
                return;
            }
            
            try
            {
                // Set debug mode
                if (options.Debug)
                {                    
                    AlibabaCloudRUMSDK_setDebuggable(true);
                }
                
                // Set app information before starting
                if (!string.IsNullOrEmpty(Application.productName))
                {
                    AlibabaCloudRUMSDK_setAppName(Application.productName);
                }
                
                if (!string.IsNullOrEmpty(Application.version))
                {
                    AlibabaCloudRUMSDK_setAppVersion(Application.version);
                }
                
                // Set environment if specified
                if (!string.IsNullOrEmpty(options.EnvironmentOverride))
                {
                    AlibabaCloudRUMSDK_setEnvironment(options.EnvironmentOverride);
                }
                
                // Start the SDK with configuration
                // Format: configAddress is the endpoint URL
                // workspace: default workspace identifier
                // serviceId: the AppId from options
                bool started = AlibabaCloudRUMSDK_start(
                    options.Endpoint ?? string.Empty,
                    options.Workspace ?? string.Empty,
                    options.ServiceId ?? string.Empty);
                
                if (started)
                {
                    _isInitialized = true;
                }
            }
            catch (Exception e)
            {
                options.LogError($"iOS SDK initialization failed: {0}\n{1}",e.Message, e.StackTrace);
            }
        }
        
        public AlibabacloudWorker CreateWorker()
        {
            return new ThreadedWorker();
        }

        public IAlibabacloudRum InitRum(AlibabacloudOptions options)
        {
            return new IOSRum(this);
        }
      
    }
}

