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

namespace FRVR
{
    public class SocialModule : MonoBehaviour
    {
    private FRVRSDK _frvrSDK;
    
    // Callback storage for IL2CPP compatibility
    private Action<int> _shareCallback;
    private Action<int> _inviteCallback;
    private Action<bool> _canInviteCallback;

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

    public void Share(string text, string image, string headline, string cta, Action<int> callback, string entryPointDataJson = "{}")
    {
        if (!Application.isEditor && Application.platform != RuntimePlatform.WebGLPlayer)
        {
            return;
        }

        _frvrSDK.DebugLog($"Sharing: {text}");

        _shareCallback = callback;

        _frvrSDK.WrapSDKAction(
            () =>
            {
                ShareSDK(text, image, headline, cta, entryPointDataJson);
            },
            () =>
            {
                // Editor simulation
                _frvrSDK.DebugLog("Editor: Simulating Share success");
                callback(1);
            }
        );
    }

    public void Invite(string text, string image, string headline, string cta, string entryPointDataJson, Action<int> callback)
    {
        if (!Application.isEditor && Application.platform != RuntimePlatform.WebGLPlayer)
        {
            return;
        }

        _frvrSDK.DebugLog($"Inviting: {text}");

        _inviteCallback = callback;

        _frvrSDK.WrapSDKAction(
            () =>
            {
                InviteSDK(text, image, headline, cta, entryPointDataJson);
            },
            () =>
            {
                // Editor simulation
                _frvrSDK.DebugLog("Editor: Simulating Invite success");
                callback(1);
            }
        );
    }

    public void CanInvite(Action<bool> callback)
    {
        if (!Application.isEditor && Application.platform != RuntimePlatform.WebGLPlayer)
        {
            callback(false);
            return;
        }

        _frvrSDK.DebugLog("Checking if can invite");

        _canInviteCallback = callback;

        _frvrSDK.WrapSDKAction(
            () =>
            {
                CanInviteSDK();
            },
            () =>
            {
                // Editor simulation
                _frvrSDK.DebugLog("Editor: Simulating CanInvite - true");
                callback(true);
            }
        );
    }

    public void AddShortcut()
    {
        if (!Application.isEditor && Application.platform != RuntimePlatform.WebGLPlayer)
        {
            return;
        }

        _frvrSDK.DebugLog("Adding shortcut");

        _frvrSDK.WrapSDKAction(
            () =>
            {
                AddShortcutSDK();
            },
            () =>
            {
                // Editor simulation
                _frvrSDK.DebugLog("Editor: Simulating AddShortcut");
            }
        );
    }

    public void SubscribePushMessages()
    {
        if (!Application.isEditor && Application.platform != RuntimePlatform.WebGLPlayer)
        {
            return;
        }

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

        _frvrSDK.WrapSDKAction(
            () =>
            {
                SubscribePushMessagesSDK();
            },
            () =>
            {
                // Editor simulation
                _frvrSDK.DebugLog("Editor: Simulating SubscribePushMessages");
            }
        );
    }

    // JSLib callback methods
    internal void HandleShareComplete(int result)
    {
        _shareCallback?.Invoke(result);
    }

    internal void HandleInviteComplete(int result)
    {
        _inviteCallback?.Invoke(result);
    }

    internal void HandleCanInviteComplete(int result)
    {
        _canInviteCallback?.Invoke(result == 1);
    }

#if UNITY_WEBGL
    [DllImport("__Internal")]
    private static extern void ShareSDK(string text, string image, string headline, string cta, string entryPointDataJson);

    [DllImport("__Internal")]
    private static extern void InviteSDK(string text, string image, string headline, string cta, string entryPointDataJson);
    
    [DllImport("__Internal")]
    private static extern void CanInviteSDK();
    
    [DllImport("__Internal")]
    private static extern void AddShortcutSDK();
    
    [DllImport("__Internal")]
    private static extern void SubscribePushMessagesSDK();
#else
    private void ShareSDK(string text, string image, string headline, string cta, string entryPointDataJson) { }
    private void InviteSDK(string text, string image, string headline, string cta, string entryPointDataJson) { }
    private void CanInviteSDK() { }
    private void AddShortcutSDK() { }
    private void SubscribePushMessagesSDK() { }
#endif
    }
}
