using Forwarder.Domain;
using Forwarder.Models;

namespace Forwarder.Services;

/// <summary>
/// Конвертер сообщений.
/// </summary>
public interface IMessageConverter
{
	/// <summary>
	/// Конвертирует сообщение в текст.
	/// </summary>
	/// <param name="message">Сообщение.</param>
	/// <returns>Текст сообщения.</returns>
	Result<string> ToText(Message message);

	/// <summary>
	/// Конвертирует текст в сообщение.
	/// </summary>
	/// <param name="source">Текст.</param>
	/// <returns>Сообщение.</returns>
	Result<Message> Parse(string source);

	/// <summary>
	/// Проверяет, может ли конвертер обработать сообщение.
	/// </summary>
	/// <param name="messageText">Текс сообщения.</param>
	/// <returns> <see langword="true"/> - если конвертер может обработать сообщение. <see langword="false"/> - в противном случае. </returns>
	bool CanHandle(string messageText);

	/// <summary>
	/// Отправляет ответ.
	/// </summary>
	/// <param name="networkSender">Отправитель сообщений по сети.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	Task<Result> SendAnswer(INetworkSender networkSender, CancellationToken cancellationToken);

	/// <summary>
	/// Имя конвертера.
	/// </summary>
	string Name { get; }
}