using UnityEngine; using System; namespace Tech3C { /// /// Main API wrapper for Tech3C SDK /// This is the main entry point for using the SDK in Unity /// public class Tech3CSDK : MonoBehaviour { private static Tech3CSDK instance; private ITech3CNativeBridge nativeBridge; private Tech3CConfig config; private bool isInitialized = false; #region Singleton /// /// Get the singleton instance of Tech3CSDK /// public static Tech3CSDK Instance { get { if (instance == null) { GameObject go = new GameObject("Tech3CSDK"); instance = go.AddComponent(); DontDestroyOnLoad(go); } return instance; } } private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); } else if (instance != this) { Destroy(gameObject); } } #endregion #region Initialization /// /// Initialize the Tech3C SDK with configuration /// /// The configuration object public void Initialize(Tech3CConfig config) { if (config == null) { Debug.LogError("[Tech3C] Config cannot be null"); return; } if (!config.IsValid()) { Debug.LogError("[Tech3C] Invalid config: Client ID and Client Secret are required"); return; } this.config = config; // Ensure Tech3CSDKBridge is created to receive callbacks from native code var bridge = Tech3CSDKBridge.Instance; Debug.Log("[Tech3C] Tech3CSDKBridge ensured for callbacks"); // Create platform-specific bridge CreateNativeBridge(); if (nativeBridge != null) { nativeBridge.Initialize(config.clientId, config.clientSecret, config); isInitialized = true; Debug.Log("[Tech3C] Initialization completed successfully"); } else { Debug.LogError("[Tech3C] Failed to create native bridge"); } } /// /// Initialize the Tech3C SDK with client credentials /// /// The client ID /// The client secret public void Initialize(string clientId, string clientSecret) { if (string.IsNullOrEmpty(clientId) || string.IsNullOrEmpty(clientSecret)) { Debug.LogError("[Tech3C] Client ID and Client Secret are required"); return; } config = Tech3CConfig.CreateDefault(); config.clientId = clientId; config.clientSecret = clientSecret; Initialize(config); } private void CreateNativeBridge() { #if UNITY_ANDROID && !UNITY_EDITOR nativeBridge = new Tech3CAndroidBridge(); #elif UNITY_IOS && !UNITY_EDITOR nativeBridge = new Tech3CiOSBridge(); #else #if UNITY_ANDROID nativeBridge = new Tech3CAndroidBridge(); #elif UNITY_IOS nativeBridge = new Tech3CiOSBridge(); #else Debug.LogWarning("[Tech3C] Running in Editor or unsupported platform. Using mock implementation."); nativeBridge = new MockBridge(); #endif #endif } #endregion #region Authentication /// /// Show authentication screen (login/register/forgot password) /// /// The callback for authentication result public void ShowAuth(IAuthCallback callback) { if (!isInitialized) { Debug.LogError("[Tech3C] SDK not initialized. Call Initialize() first."); callback?.OnAuthError(-1, "SDK not initialized"); return; } nativeBridge?.ShowAuth(callback); } /// /// Show authentication screen without callback /// public void ShowAuth() { ShowAuth(null); } #endregion #region User Management /// /// Logout current user /// /// The callback for logout result public void Logout(ILogoutCallback callback) { if (!isInitialized) { Debug.LogError("[Tech3C] SDK not initialized. Call Initialize() first."); callback?.OnLogoutError(-1, "SDK not initialized"); return; } nativeBridge?.Logout(callback); } /// /// Logout current user without callback /// public void Logout() { Logout(null); } /// /// Get user information /// /// The callback for user info result public void GetUserInfo(IUserInfoCallback callback) { if (!isInitialized) { Debug.LogError("[Tech3C] SDK not initialized. Call Initialize() first."); callback?.OnUserInfoError(-1, "SDK not initialized"); return; } nativeBridge?.GetUserInfo(callback); } /// /// Get user information without callback /// public void GetUserInfo() { GetUserInfo(null); } #endregion #region State Checkers /// /// Check if user is logged in /// public bool IsLoggedIn() { if (!isInitialized) { Debug.LogWarning("[Tech3C] SDK not initialized"); return false; } return nativeBridge?.IsLoggedIn() ?? false; } /// /// Check if access token is expired /// public bool IsTokenExpired() { if (!isInitialized) { Debug.LogWarning("[Tech3C] SDK not initialized"); return true; } return nativeBridge?.IsTokenExpired() ?? true; } #endregion #region Token Management /// /// Get access token /// public string GetAccessToken() { if (!isInitialized) { Debug.LogWarning("[Tech3C] SDK not initialized"); return null; } return nativeBridge?.GetAccessToken(); } /// /// Get refresh token /// public string GetRefreshToken() { if (!isInitialized) { Debug.LogWarning("[Tech3C] SDK not initialized"); return null; } return nativeBridge?.GetRefreshToken(); } #endregion #region User Information /// /// Get user ID /// public string GetUserId() { if (!isInitialized) { Debug.LogWarning("[Tech3C] SDK not initialized"); return null; } return nativeBridge?.GetUserId(); } /// /// Get device ID /// public string GetDeviceId() { if (!isInitialized) { Debug.LogWarning("[Tech3C] SDK not initialized"); return null; } return nativeBridge?.GetDeviceId(); } /// /// Get login timestamp /// public long GetLoginTime() { if (!isInitialized) { Debug.LogWarning("[Tech3C] SDK not initialized"); return 0; } return nativeBridge?.GetLoginTime() ?? 0; } /// /// Get token expiry timestamp /// public long GetTokenExpiry() { if (!isInitialized) { Debug.LogWarning("[Tech3C] SDK not initialized"); return 0; } return nativeBridge?.GetTokenExpiry() ?? 0; } #endregion #region Configuration /// /// Set display language /// /// The language to set public void SetLanguage(Language language) { if (!isInitialized) { Debug.LogWarning("[Tech3C] SDK not initialized"); return; } nativeBridge?.SetLanguage(language); } /// /// Set debug mode /// /// Enable or disable debug mode public void SetDebug(bool debug) { if (!isInitialized) { Debug.LogWarning("[Tech3C] SDK not initialized"); return; } nativeBridge?.SetDebug(debug); } #endregion #region Cleanup /// /// Cleanup SDK resources /// public void Cleanup() { nativeBridge?.Cleanup(); nativeBridge = null; config = null; isInitialized = false; Debug.Log("[Tech3C] Cleanup completed"); } private void OnDestroy() { Cleanup(); } #endregion #region Properties /// /// Get the current configuration /// public Tech3CConfig Config => config; /// /// Check if SDK is initialized /// public bool IsInitialized => isInitialized; #endregion } /// /// Mock bridge for testing in editor or unsupported platforms /// internal class MockBridge : ITech3CNativeBridge { private bool isLoggedIn = false; private string accessToken = "mock_access_token"; private string refreshToken = "mock_refresh_token"; private string userId = "mock_user_id"; public void Initialize(string clientId, string clientSecret, Tech3CConfig config) { Debug.Log($"[Tech3C Mock] Initialized with Client ID: {clientId}"); } public void ShowAuth(IAuthCallback callback) { Debug.Log("[Mock3C Mock] ShowAuth called"); isLoggedIn = true; string password = "mock_password"; callback?.OnAuthSuccess(userId, password, accessToken, refreshToken, LoginType.ACCOUNT, DateTime.Now.Ticks + 3600000); } public void Logout(ILogoutCallback callback) { Debug.Log("[Tech3C Mock] Logout called"); isLoggedIn = false; callback?.OnLogoutSuccess(); } public void GetUserInfo(IUserInfoCallback callback) { Debug.Log("[Tech3C Mock] GetUserInfo called"); callback?.OnUserInfoReceived(userId, "mock_username", "mock@example.com", "1234567890"); } public bool IsLoggedIn() => isLoggedIn; public string GetAccessToken() => isLoggedIn ? accessToken : null; public string GetRefreshToken() => isLoggedIn ? refreshToken : null; public string GetUserId() => isLoggedIn ? userId : null; public string GetDeviceId() => "mock_device_id"; public long GetLoginTime() => isLoggedIn ? DateTime.Now.Ticks : 0; public long GetTokenExpiry() => isLoggedIn ? DateTime.Now.Ticks + 3600000 : 0; public bool IsTokenExpired() => false; public void SetLanguage(Language language) { Debug.Log($"[Tech3C Mock] Language set to {language}"); } public void SetDebug(bool debug) { Debug.Log($"[Tech3C Mock] Debug mode set to {debug}"); } public void Cleanup() { Debug.Log("[Tech3C Mock] Cleanup completed"); } } }