using System;
using System.Collections.Generic;
using System.Threading.Tasks;
#if SHIROGIN_FIREBASE_ANALYTICS || SHIROGIN_FIREBASE_REMOTE_CONFIG
using Firebase;
using Firebase.Analytics;
#endif
using ShiroginSDK.Runtime.Core.SDK;
using ShiroginSDK.Runtime.Modules.Events;
using ShiroginSDK.Runtime.Services.Base;
using ShiroginSDK.Runtime.Services.Interfaces;
using UnityEngine;
namespace ShiroginSDK.Runtime.Services.Implementations.Firebase
{
#if SHIROGIN_FIREBASE_ANALYTICS || SHIROGIN_FIREBASE_REMOTE_CONFIG
///
/// Centralized Firebase handler for ShiroginSDK.
/// Handles initialization, readiness and event logging for analytics or remote config.
///
public class FirebaseService : ServiceBase, IFirebaseService
{
private FirebaseApp _firebaseApp;
private Task _initializationTask;
private ShiroginConfig _config;
private IEventService _eventService;
public bool IsReady { get; private set; }
// ----------------------------------------------------------
// Analytics
// ----------------------------------------------------------
public void LogEvent(string eventName, Dictionary parameters = null)
{
#if SHIROGIN_FIREBASE_ANALYTICS
try
{
if (parameters == null)
{
FirebaseAnalytics.LogEvent(eventName);
}
else
{
var paramList = new List();
foreach (var kvp in parameters)
switch (kvp.Value)
{
case string s:
paramList.Add(new Parameter(kvp.Key, s));
break;
case int i:
paramList.Add(new Parameter(kvp.Key, i));
break;
case double d:
paramList.Add(new Parameter(kvp.Key, d));
break;
case float f:
paramList.Add(new Parameter(kvp.Key, f));
break;
default:
paramList.Add(new Parameter(kvp.Key, kvp.Value?.ToString() ?? "null"));
break;
}
FirebaseAnalytics.LogEvent(eventName, paramList.ToArray());
}
Debug.Log($"[FirebaseService] ✅ Event logged: {eventName}");
}
catch (Exception ex)
{
Debug.LogError($"[FirebaseService] ❌ Failed to log event {eventName}: {ex.Message}");
}
#else
Debug.LogWarning($"[FirebaseService] ⚠️ Not ready or disabled. Skipped event: {eventName}");
#endif
}
public void TrackAppFirstOpen()
{
if (!IsReady || _config == null)
return;
#if SHIROGIN_FIREBASE_ANALYTICS
FirebaseAnalytics.LogEvent(FirebaseAnalytics.EventTutorialComplete,
new Parameter("device_model", SystemInfo.deviceModel),
new Parameter("os_version", SystemInfo.operatingSystem));
Debug.Log("[FirebaseService] 📲 App first open tracked.");
#else
Debug.Log("[FirebaseService] Dummy first open tracked.");
#endif
}
// ----------------------------------------------------------
// Initialization
// ----------------------------------------------------------
protected override async void OnInitialize()
{
_config = ShiroginConfig.Load();
_eventService = ServiceLocator.Get();
if (!_config.enableFirebaseAnalytics && !_config.enableFirebaseRemoteConfig)
{
Debug.LogWarning(
"[FirebaseService] 🛑 All Firebase modules DISABLED in Config. Running in Dummy Mode.");
return;
}
if (_config == null)
{
Debug.LogError("[FirebaseService] Missing SDKConfig.");
return;
}
#if SHIROGIN_FIREBASE_ANALYTICS || SHIROGIN_FIREBASE_REMOTE_CONFIG
if (_initializationTask != null)
{
await _initializationTask; // Wait for ongoing init
return;
}
_initializationTask = InitializeFirebaseAsync();
await _initializationTask;
#else
Debug.Log(
"[FirebaseService] ⚠️ Firebase SDK not installed or 'SHIROGIN_FIREBASE_ANALYTICS' 'SHIROGIN_FIREBASE_REMOTE_CONFIG' not defined. Running in Headless Mode.");
#endif
}
protected override void OnDispose()
{
#if SHIROGIN_FIREBASE_ANALYTICS || SHIROGIN_FIREBASE_REMOTE_CONFIG
_firebaseApp = null;
#endif
IsReady = false;
_eventService = null;
}
private async Task InitializeFirebaseAsync()
{
#if SHIROGIN_FIREBASE_ANALYTICS || SHIROGIN_FIREBASE_REMOTE_CONFIG
try
{
var dep = await FirebaseApp.CheckAndFixDependenciesAsync();
if (dep != DependencyStatus.Available)
{
Debug.LogError($"[FirebaseService] ❌ Dependency error: {dep}");
return;
}
_firebaseApp = FirebaseApp.DefaultInstance;
IsReady = true;
Debug.Log("[FirebaseService] ✅ Firebase initialized successfully.");
_eventService?.Invoke(new ShiroginEvents.Firebase.FirebaseReadyEvent());
}
catch (Exception ex)
{
Debug.LogError($"[FirebaseService] ❌ Firebase initialization failed: {ex.Message}");
}
#else
Debug.Log(
"[FirebaseService] ⚠️ Firebase SDK not installed or 'SHIROGIN_FIREBASE_ANALYTICS' 'SHIROGIN_FIREBASE_REMOTE_CONFIG' not defined. Running in Headless Mode.");
#endif
}
}
#else
///
/// Centralized Firebase handler for ShiroginSDK.
/// Handles initialization, readiness and event logging for analytics or remote config.
///
public class FirebaseService : ServiceBase, IFirebaseService
{
private ShiroginConfig _config;
private IEventService _eventService;
public bool IsReady { get; private set; }
// ----------------------------------------------------------
// Analytics
// ----------------------------------------------------------
public void LogEvent(string eventName, Dictionary parameters = null)
{
Debug.LogWarning($"[FirebaseService] ⚠️ Not ready or disabled. Skipped event: {eventName}");
}
public void TrackAppFirstOpen()
{
if (!IsReady || _config == null)
return;
Debug.Log("[FirebaseService] Dummy first open tracked.");
}
// ----------------------------------------------------------
// Initialization
// ----------------------------------------------------------
protected override async void OnInitialize()
{
_config = ShiroginConfig.Load();
_eventService = ServiceLocator.Get();
if (_config == null)
{
Debug.LogError("[FirebaseService] Missing SDKConfig.");
return;
}
Debug.Log(
"[FirebaseService] ⚠Dummy OnInitialize");
}
protected override void OnDispose()
{
IsReady = false;
_eventService = null;
}
private async Task InitializeFirebaseAsync()
{
Debug.Log(
"[FirebaseService] ⚠Dummy InitializeFirebaseAsync");
}
}
#endif
}