using System;
using UnityEngine;
using UnityEngine.SceneManagement;

namespace Alibabacloud.Rum.Unity.Integrations
{
    public interface IApplication
    {
        event Application.LogCallback LogMessageReceived;
        event Action LowMemory;
        event Action Quitting;
        string ActiveSceneName { get; }
        bool IsEditor { get; }
        string ProductName { get; }
        string Version { get; }
        string BuildGUID { get; }
        string UnityVersion { get; }
        string PersistentDataPath { get; }
        RuntimePlatform Platform { get; }
    }
    
    public sealed class ApplicationAdapter : IApplication
    {
        public static readonly ApplicationAdapter Instance = new();

        private ApplicationAdapter()
        {
            Application.logMessageReceivedThreaded += OnLogMessageReceived;
            Application.lowMemory += OnLowMemory;
            Application.quitting += OnQuitting;
        }

        public event Application.LogCallback? LogMessageReceived;
        public event Action? LowMemory;

        public event Action? Quitting;

        public string ActiveSceneName => SceneManager.GetActiveScene().name;

        public bool IsEditor => Application.isEditor;

        public string ProductName => Application.productName;

        public string Version => Application.version;

        public string BuildGUID => Application.buildGUID;

        public string UnityVersion => Application.unityVersion;

        public string PersistentDataPath => Application.persistentDataPath;

        public RuntimePlatform Platform => Application.platform;

        private void OnLogMessageReceived(string condition, string stackTrace, LogType type)
            => LogMessageReceived?.Invoke(condition, stackTrace, type);

        private void OnLowMemory()
            => LowMemory?.Invoke();

        private void OnQuitting()
            => Quitting?.Invoke();
    }
}
