using Innoactive.AccessControl.OAuth2;
using System;
using UnityEngine;

namespace Innoactive.AccessControl.Authorizer
{
    public class AndroidAuthorizer : IAuthorizer
    {
        private const string unityPlayerClassPath = "com.unity3d.player.UnityPlayer";
        private const string accessControlClassPath = "com.innoactive.portal.security.AccessControl";

        // Common public key used for client communication.
        private const string PUBLIC_KEY =
        "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm3IOm8+nBis4RJFVJu3W" +
        "zeIyu0akwHMa7JfaMu+xr445/uoc3naEp8I3YGKvNVAckqBWgTZDb3GZQKnNnvXM" +
        "5fnVcObNJAKAemGhdHJinoIl2LBlEPbzjUSIDnrqMTTxzWPvlDdcnm6y0D2HkYSi" +
        "ssPAcQsAxWcO4Hd1QPz7j0xo2UBKIcLQdqKQymws8clJf6Ga70NcHSo3Qt5EvhHs" +
        "7k/4QvIB0T1LH6Vk0pw6SoyuhqDSPSTWDm/tSF+TaQONmMBaXcaxK1Xe/G/w5AS4" +
        "ZcItRpy7ZAeKFxDyXIupiFAHKbRSZUN+N6WkvGUCWt0AAYME9FLevOOmngT7HHWo" +
        "7QIDAQAB";

        private readonly string publicKey;

        /// <summary>
        /// Public key used, is expected to be cleaned of any additional chars.
        /// </summary>
        public AndroidAuthorizer(string key = PUBLIC_KEY)
        {
            publicKey = key.Replace("\n", "").Trim();
        }

        public bool Authorize(OAuth2ClientSettings clientSettings)
        {
            try
            {
                AndroidJavaClass unityPlayer = new AndroidJavaClass(unityPlayerClassPath);
                AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

                AndroidJavaClass accessControl = new AndroidJavaClass(accessControlClassPath);
                return accessControl.CallStatic<bool>("AuthorizeApplication", currentActivity, publicKey);
            }
            catch (Exception ex)
            {
                Debug.LogError(ex);
                return false;
            }
        }
    }
}
