using System;
using System.Collections.Generic;
namespace NucuCar.Domain.Utilities
{
///
/// This class is used to translate C# dictionaries into firebase json format.
///
public static class FirebaseRestTranslator
{
public static Dictionary Translate(string name, Dictionary dict)
{
return BuildRoot(name, dict);
}
private static Dictionary BuildRoot(string name, Dictionary dict)
{
var root = new Dictionary();
root["name"] = name;
root["fields"] = new Dictionary();
// iterate through fields and build leaf
foreach (var entry in dict)
{
var fields = (Dictionary) root["fields"];
fields[entry.Key] = BuildNode(entry.Value);
}
return root;
}
private static Dictionary BuildNode(object value)
{
switch (value)
{
case string v:
{
if (DateTime.TryParse(v, out _))
{
return BuildTimestamp(v);
}
return BuildString(v);
}
case int v:
{
return BuildInteger(v);
}
case double v:
{
return BuildDouble(v);
}
case bool v:
{
return BuildBool(v);
}
case List> v:
{
return BuildArray(v);
}
case Dictionary v:
{
return BuildMap(v);
}
}
throw new ArgumentException($"Can't build leaf! Unknown type for: {value}");
}
private static Dictionary BuildSimpleValue(string type, object value)
{
return new Dictionary()
{
[type] = value
};
}
private static Dictionary BuildString(string value)
{
return BuildSimpleValue("stringValue", value);
}
private static Dictionary BuildInteger(int value)
{
return BuildSimpleValue("integerValue", value);
}
private static Dictionary BuildTimestamp(string value)
{
return BuildSimpleValue("timestampValue", value);
}
private static Dictionary BuildDouble(double value)
{
return BuildSimpleValue("doubleValue", value);
}
private static Dictionary BuildBool(bool value)
{
return BuildSimpleValue("booleanValue", value);
}
private static Dictionary BuildArray(List> array)
{
var values = new List>();
var root = new Dictionary
{
["arrayValue"] = new Dictionary
{
["values"] = values
}
};
foreach (var entry in array)
{
values.Add(BuildNode(entry));
}
return root;
}
private static Dictionary BuildMap(Dictionary map)
{
var fields = new Dictionary();
var root = new Dictionary
{
["mapValue"] = new Dictionary
{
["fields"] = fields
}
};
foreach (var entry in map)
{
fields[entry.Key] = BuildNode(entry.Value);
}
return root;
}
}
}