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

using Firebase;
using Firebase.Storage;

using UnityEngine;

namespace Bayat.SaveSystem.Storage
{

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

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

        public IStorage CreateStorage(StorageConnectionString connectionString)
        {
            if (connectionString.Prefix == "firebase-cloud" || connectionString.Prefix == "firebase-storage" || connectionString.Prefix == "firebase-cloud-storage")
            {
                string encodingName = connectionString.Get("encoding", StorageBase.DefaultTextEncodingName, "text-encoding", "encoding-name");
                bool useBase64 = connectionString.GetBoolean("usebase64", false, "use-base64");
                string storageUrl = connectionString.Get("storage", string.Empty, "storage-url", "storage-instance");
                string storageReferencePath = connectionString.Get("reference", string.Empty, "storage-reference");
                string storageReferenceUrl = connectionString.Get("reference-url", string.Empty, "storage-reference-url", "reference-url");
                FirebaseStorage storageInstance = FirebaseStorage.DefaultInstance;
                if (!string.IsNullOrEmpty(storageUrl))
                {
                    storageInstance = FirebaseStorage.GetInstance(storageUrl);
                }
                StorageReference storageReference = storageInstance.RootReference;
                if (!string.IsNullOrEmpty(storageReferencePath))
                {
                    storageReference = storageInstance.GetReference(storageReferencePath);
                }
                else if (!string.IsNullOrEmpty(storageReferenceUrl))
                {
                    storageReference = storageInstance.GetReferenceFromUrl(storageReferenceUrl);
                }
                return new FirebaseCloudStorage(encodingName, useBase64, storageInstance, storageReference);
            }

            return null;
        }

    }

}