using System;
using System.Runtime.InteropServices;
using UnityEngine;

namespace FRVR
{
    public class NotificationsModule : MonoBehaviour
    {
        private FRVRSDK _frvrSDK;

        // Callback storage for IL2CPP compatibility
        private Action<bool> _canScheduleMessagesCallback;
        private Action<string> _canScheduleMessagesErrorCallback;
        private Action _subscribeScheduleMessagesCallback;
        private Action<string> _subscribeScheduleMessagesErrorCallback;
        private Action _scheduleMessageCallback;
        private Action<string> _scheduleMessageErrorCallback;

        public void Init(FRVRSDK frvrSDK)
        {
            _frvrSDK = frvrSDK;
        }

        public void CanScheduleMessages(Action<bool> onSuccess, Action<string> onError = null)
        {
            if (!Application.isEditor && Application.platform != RuntimePlatform.WebGLPlayer)
            {
                onSuccess(false);
                return;
            }

            _frvrSDK.DebugLog("Checking if can schedule messages");

            _canScheduleMessagesCallback = onSuccess;
            _canScheduleMessagesErrorCallback = onError;

            _frvrSDK.WrapSDKAction(
                () =>
                {
                    NotificationsCanScheduleMessagesSDK();
                },
                () =>
                {
                    _frvrSDK.DebugLog("Editor: Simulating CanScheduleMessages - true");
                    onSuccess(true);
                }
            );
        }

        public void SubscribeScheduleMessages(Action onSuccess, Action<string> onError = null)
        {
            if (!Application.isEditor && Application.platform != RuntimePlatform.WebGLPlayer)
            {
                return;
            }

            _frvrSDK.DebugLog("Subscribing to schedule messages");

            _subscribeScheduleMessagesCallback = onSuccess;
            _subscribeScheduleMessagesErrorCallback = onError;

            _frvrSDK.WrapSDKAction(
                () =>
                {
                    NotificationsSubscribeScheduleMessagesSDK();
                },
                () =>
                {
                    _frvrSDK.DebugLog("Editor: Simulating SubscribeScheduleMessages success");
                    onSuccess();
                }
            );
        }

        public void ScheduleMessage(string configJson, Action onSuccess, Action<string> onError = null)
        {
            if (!Application.isEditor && Application.platform != RuntimePlatform.WebGLPlayer)
            {
                return;
            }

            _frvrSDK.DebugLog("Scheduling message: " + configJson);

            _scheduleMessageCallback = onSuccess;
            _scheduleMessageErrorCallback = onError;

            _frvrSDK.WrapSDKAction(
                () =>
                {
                    NotificationsScheduleMessageSDK(configJson);
                },
                () =>
                {
                    _frvrSDK.DebugLog("Editor: Simulating ScheduleMessage success");
                    onSuccess();
                }
            );
        }

        public void ScheduleMessage(ScheduleMessageConfig config, Action onSuccess, Action<string> onError = null)
        {
            ScheduleMessage(JsonUtility.ToJson(config), onSuccess, onError);
        }

        // JSLib callback methods
        internal void HandleNotificationsCanScheduleMessagesComplete(int result)
        {
            _canScheduleMessagesCallback?.Invoke(result == 1);
        }

        internal void HandleNotificationsCanScheduleMessagesError(string errorJson)
        {
            _canScheduleMessagesErrorCallback?.Invoke(errorJson);
        }

        internal void HandleNotificationsSubscribeScheduleMessagesComplete()
        {
            _subscribeScheduleMessagesCallback?.Invoke();
        }

        internal void HandleNotificationsSubscribeScheduleMessagesError(string errorJson)
        {
            _subscribeScheduleMessagesErrorCallback?.Invoke(errorJson);
        }

        internal void HandleNotificationsScheduleMessageComplete()
        {
            _scheduleMessageCallback?.Invoke();
        }

        internal void HandleNotificationsScheduleMessageError(string errorJson)
        {
            _scheduleMessageErrorCallback?.Invoke(errorJson);
        }

#if UNITY_WEBGL
        [DllImport("__Internal")]
        private static extern void NotificationsCanScheduleMessagesSDK();

        [DllImport("__Internal")]
        private static extern void NotificationsSubscribeScheduleMessagesSDK();

        [DllImport("__Internal")]
        private static extern void NotificationsScheduleMessageSDK(string configJson);
#else
        private static void NotificationsCanScheduleMessagesSDK() { }
        private static void NotificationsSubscribeScheduleMessagesSDK() { }
        private static void NotificationsScheduleMessageSDK(string configJson) { }
#endif
    }

    [Serializable]
    public class ScheduleMessageButton
    {
        public string type;
        public string title;
        public string payload;
    }

    [Serializable]
    public class ScheduleMessageConfig
    {
        public string playerId;
        public long delayInSeconds;
        public string imageUrl;
        public string message;
        public ScheduleMessageButton[] buttons;
    }
}
