﻿using System.Collections;
using System.Collections.Generic;

using Firebase;
using Firebase.Database;

using UnityEngine;

namespace Bayat.SaveSystem.Storage
{

    /// <summary>
    /// The Firebase Realtime Database connection factory.
    /// </summary>
    public class FirebaseRealtimeDatabaseConnectionFactory : IConnectionFactory
    {

        [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
        private static void Register()
        {
            ConnectionStringFactory.Register(new FirebaseRealtimeDatabaseConnectionFactory());
        }

        public IStorage CreateStorage(StorageConnectionString connectionString)
        {
            if (connectionString.Prefix == "firebase" || connectionString.Prefix == "firebase-database" || connectionString.Prefix == "firebase-realtime" || connectionString.Prefix == "firebase-realtime-database")
            {
                string encodingName = connectionString.Get("encoding", StorageBase.DefaultTextEncodingName, "text-encoding", "encoding-name");
                bool useBase64 = connectionString.GetBoolean("usebase64", false, "use-base64");
                string databaseUrl = connectionString.Get("database", string.Empty, "database-url", "database-instance");
                string databaseReferencePath = connectionString.Get("reference", string.Empty, "database-reference");
                string databaseReferenceUrl = connectionString.Get("reference-url", string.Empty, "database-reference-url", "reference-url");
                FirebaseDatabase databaseInstance = FirebaseDatabase.DefaultInstance;
                if (!string.IsNullOrEmpty(databaseUrl))
                {
                    databaseInstance = FirebaseDatabase.GetInstance(databaseUrl);
                }
                DatabaseReference databaseReference = databaseInstance.RootReference;
                if (!string.IsNullOrEmpty(databaseReferencePath))
                {
                    databaseReference = databaseInstance.GetReference(databaseReferencePath);
                }
                else if (!string.IsNullOrEmpty(databaseReferenceUrl))
                {
                    databaseReference = databaseInstance.GetReferenceFromUrl(databaseReferenceUrl);
                }
                return new FirebaseRealtimeDatabaseStorage(encodingName, useBase64, databaseInstance, databaseReference);
            }

            return null;
        }

    }

}