using SoftwareInstallationContracts.BindingModels;
using SoftwareInstallationContracts.BusinessLogicsContracts;
using SoftwareInstallationContracts.SearchModels;
using SoftwareInstallationContracts.StoragesContract;
using SoftwareInstallationContracts.ViewModels;
using DocumentFormat.OpenXml.EMMA;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SoftwareInstallationBusinessLogic
{
	public class MessageInfoLogic : IMessageInfoLogic
	{
		private readonly ILogger _logger;
		private readonly IMessageInfoStorage _messageInfoStorage;
		public MessageInfoLogic(ILogger<MessageInfoLogic> logger, IMessageInfoStorage messageInfoStorage)
		{
			_logger = logger;
			_messageInfoStorage = messageInfoStorage;
		}

		public bool Create(MessageInfoBindingModel model)
		{
			if (_messageInfoStorage.Insert(model) == null)
			{
				_logger.LogWarning("Insert operation failed");
				return false;
			}
			return true;
		}

        public MessageInfoViewModel? ReadElement(MessageInfoSearchModel model)
        {
            var res = _messageInfoStorage.GetElement(model);
			if (res == null)
            {
                _logger.LogWarning("Read element operation failed");
                return null;
            }
            return res;
        }

        public bool Update(MessageInfoBindingModel model)
        {
            if (_messageInfoStorage.Update(model) == null)
            {
                _logger.LogWarning("Update operation failed");
                return false;
            }
            return true;
        }

        public List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model)
		{
			_logger.LogInformation("ReadList. MessageId:{MessageId}.ClientId:{ClientId} ", model?.MessageId, model?.ClientId);
			var list = (model == null) ? _messageInfoStorage.GetFullList() : _messageInfoStorage.GetFilteredList(model);
			if (list == null)
			{
				_logger.LogWarning("ReadList return null list");
				return null;
			}
			_logger.LogInformation("ReadList. Count:{Count}", list.Count);
			return list;
		}
	}
}
