using Firebase; using Firebase.Auth; using Firebase.Firestore; using System; using System.Threading.Tasks; using UnityEngine; namespace BulletHellTemplate { /// /// Handles Firebase-specific authentication, storing the authenticated user, /// and delegating data loading to FirebaseManager. /// public class FirebaseAuthManager : MonoBehaviour { [Tooltip("Singleton instance for global access.")] public static FirebaseAuthManager Singleton; private bool instanceInitialized; private FirebaseAuth firebaseAuth; private FirebaseFirestore firebaseFirestore; private FirebaseUser currentUser; private void Awake() { if (Singleton == null) { Singleton = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } /// /// Indicates if this FirebaseAuthManager was successfully initialized. /// /// True if initialized, false otherwise. public bool IsInitialized() { return instanceInitialized; } /// /// Initializes FirebaseAuthManager with the provided FirebaseAuth and FirebaseFirestore instances. /// /// FirebaseAuth instance. /// FirebaseFirestore instance. public void InitializeAuthBackend(FirebaseAuth auth, FirebaseFirestore firestore) { firebaseAuth = auth; firebaseFirestore = firestore; currentUser = firebaseAuth.CurrentUser; instanceInitialized = true; } /// /// Returns the current FirebaseUser, or null if none is logged in. /// public FirebaseUser GetCurrentUser() { return currentUser; } /// /// Logs in a user with email and password using FirebaseAuth. /// /// The user's email. /// The user's password. public async Task LoginWithEmailAsync(string email, string password) { if (!instanceInitialized) { throw new Exception("FirebaseAuthManager not initialized."); } await firebaseAuth.SignInWithEmailAndPasswordAsync(email, password); currentUser = firebaseAuth.CurrentUser; } /// /// Logs in a user anonymously using FirebaseAuth. /// public async Task LoginAnonymouslyAsync() { if (!instanceInitialized) { throw new Exception("FirebaseAuthManager not initialized."); } await firebaseAuth.SignInAnonymouslyAsync(); currentUser = firebaseAuth.CurrentUser; } /// /// Creates a new user account with the specified email and password. /// /// User's email. /// User's password. public async Task CreateAccountAsync(string email, string password) { if (!instanceInitialized) { throw new Exception("FirebaseAuthManager not initialized."); } await firebaseAuth.CreateUserWithEmailAndPasswordAsync(email, password); currentUser = firebaseAuth.CurrentUser; } /// /// Calls FirebaseManager to load and synchronize the current user's data from Firestore. /// Returns a message describing the load result. /// public async Task LoadPlayerDataAsync() { if (!instanceInitialized) { return "FirebaseAuthManager is not initialized."; } if (currentUser == null) { return "No user is currently logged in."; } string userId = currentUser.UserId; return await FirebaseManager.Singleton.LoadAndSyncPlayerData(userId); } } }