// using System.Diagnostics;
// using System.Reactive.Linq;
// using InnovEnergy.Lib.Protocols.DBus;
// using InnovEnergy.Lib.Protocols.DBus.Protocol;
// using InnovEnergy.Lib.Protocols.DBus.Protocol.DataTypes;
// using InnovEnergy.Lib.Protocols.DBus.Protocol.Header;
//
// namespace InnovEnergy.Lib.Victron.VeDBus;
//
// public class VeDbusService : IDisposable
// {
//     private DBusConnection DbusConnection { get; }
//     public VeProperties Properties { get; } 
//
//     public VeDbusService(Bus bus, String busName, VeProperties properties)
//     {
//         DbusConnection = new DBusConnection(bus);
//
//         DbusConnection.IncomingMessages
//                       .Where(m => m.Type == MessageType.MethodCall)
//                       .Do(m => Debug.WriteLine($"Got call from {m.Sender} : {m.Member} {m.ObjectPath}")) 
//                       .Select(AnswerMethodCalls)
//                       .Subscribe(DbusConnection.OutgoingMessages.OnNext);
//     }
//
//
//     private Message AnswerMethodCalls(Message msg)
//     {
//         if (!msg.ObjectPath.HasValue)
//             return msg.CreateErrorReply("Unknown ObjectPath");
//
//         
//         if (msg.ObjectPath == ObjectPath.Root)
//         {
//             return msg.Member switch
//             {
//                 VeDBusApi.GetValue => msg.CreateMethodReturn(Properties.GetValueOfAllProperties()),
//                 VeDBusApi.GetText  => msg.CreateMethodReturn(Properties.GetTextOfAllProperties()),
//                 _                  => msg.CreateErrorReply("Unknown Member")
//             };
//         }
//
//         var prop = Properties.Get(msg.ObjectPath.Value);
//
//         if (prop.HasValue)
//         {
//             return msg.Member switch
//             {
//                 VeDBusApi.GetValue => msg.CreateMethodReturn(prop.Value.Value),
//                 VeDBusApi.GetText  => msg.CreateMethodReturn(prop.Value.Text),
//                 _                  => msg.CreateErrorReply("Unknown Member")
//             };
//         }
//
//         return msg.CreateErrorReply("Unknown ObjectPath");
//     }
//     
//     public void Dispose() => DbusConnection.Dispose();
//
// }