using System;
using System.Collections.Generic;
using UnityEngine;

namespace DlserveSDK
{
    public static class Dlserve
    {
        private static AndroidJavaClass _bridge;

        public static event Action<DlserveNotificationEvent> OnNotification;

        public static void Init(string appId)
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            DlserveCallbackReceiver.EnsureExists();
            _bridge = new AndroidJavaClass("ai.dlserve.unity.DlserveUnityBridge");
            using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            using (var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
            using (var context = activity.Call<AndroidJavaObject>("getApplicationContext"))
            {
                _bridge.CallStatic("init", context, appId);
            }
#else
            Debug.Log($"[Dlserve] Init({appId}) — Android only, no-op in Editor");
#endif
        }

        public static void Login(string externalId)
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            _bridge?.CallStatic("login", externalId);
#endif
        }

        public static void Logout()
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            _bridge?.CallStatic("logout");
#endif
        }

        public static void SetTags(Dictionary<string, string> tags)
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            if (_bridge == null || tags == null) return;
            using (var map = DictToJavaMap(tags))
            {
                _bridge.CallStatic("setTags", map);
            }
#endif
        }

        public static void RemoveTags(params string[] keys)
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            if (_bridge == null || keys == null || keys.Length == 0) return;
            using (var map = new AndroidJavaObject("java.util.HashMap"))
            {
                foreach (var key in keys)
                    map.Call<AndroidJavaObject>("put", key, null);
                _bridge.CallStatic("setTags", map);
            }
#endif
        }

        public static void OnNewToken(string token)
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            _bridge?.CallStatic("onNewToken", token);
#endif
        }

        public static bool HandleMessageIfDlserve(string jsonData)
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            if (_bridge == null) return false;
            using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            using (var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                return _bridge.CallStatic<bool>("handleMessageJson", activity, jsonData);
            }
#else
            return false;
#endif
        }

        internal static void RaiseOnNotification(DlserveNotificationEvent evt)
        {
            OnNotification?.Invoke(evt);
        }

        private static AndroidJavaObject DictToJavaMap(Dictionary<string, string> dict)
        {
            var map = new AndroidJavaObject("java.util.HashMap");
            foreach (var kvp in dict)
                map.Call<AndroidJavaObject>("put", kvp.Key, kvp.Value);
            return map;
        }
    }
}
