using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;

namespace MQTTnet.Server.Scripting.DataSharing
{
    public class DataSharingService
    {
        private readonly Dictionary<string, object> _storage = new Dictionary<string, object>();
        private readonly PythonScriptHostService _pythonScriptHostService;
        private readonly ILogger<DataSharingService> _logger;

        public DataSharingService(PythonScriptHostService pythonScriptHostService, ILogger<DataSharingService> logger)
        {
            _pythonScriptHostService = pythonScriptHostService ?? throw new ArgumentNullException(nameof(pythonScriptHostService));
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }

        public void Configure()
        {
            _pythonScriptHostService.RegisterProxyObject("write_shared_data", new Action<string, object>(Write));
            _pythonScriptHostService.RegisterProxyObject("read_shared_data", new Func<string, object, object>(Read));
        }

        public void Write(string key, object value)
        {
            lock (_storage)
            {
                _storage[key] = value;
                _logger.LogInformation($"Shared data with key '{key}' updated.");
            }
        }

        public object Read(string key, object defaultValue)
        {
            lock (_storage)
            {
                if (!_storage.TryGetValue(key, out var value))
                {
                    return defaultValue;
                }

                return value;
            }
        }
    }
}
