//
//  PacketSerializer.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using NosCore.Packets;
using NosCore.Packets.Interfaces;
using NosSmooth.Core.Packets.Converters;
using Remora.Results;
namespace NosSmooth.Core.Packets;
/// 
public class PacketSerializer : IPacketSerializer
{
    private readonly Serializer _serializer;
    private readonly Deserializer _deserializer;
    private readonly IEnumerable _specificPacketSerializers;
    /// 
    /// Initializes a new instance of the  class.
    /// 
    /// The NosCore serializer.
    /// The NosCore deserializer.
    /// The specific packet serializers.
    public PacketSerializer
    (
        Serializer serializer,
        Deserializer deserializer,
        IEnumerable specificPacketSerializers
    )
    {
        _serializer = serializer;
        _deserializer = deserializer;
        _specificPacketSerializers = specificPacketSerializers;
    }
    /// 
    public Result Serialize(IPacket packet)
    {
        try
        {
            foreach (var specificPacketSerializer in _specificPacketSerializers)
            {
                if (specificPacketSerializer.Serializer && specificPacketSerializer.ShouldHandle(packet))
                {
                    return specificPacketSerializer.Serialize(packet);
                }
            }
            return _serializer.Serialize(packet);
        }
        catch (Exception e)
        {
            return e;
        }
    }
    /// 
    public Result Deserialize(string packetString)
    {
        try
        {
            foreach (var specificPacketSerializer in _specificPacketSerializers)
            {
                if (specificPacketSerializer.Deserializer && specificPacketSerializer.ShouldHandle(packetString))
                {
                    return specificPacketSerializer.Deserialize(packetString);
                }
            }
            return Result.FromSuccess(_deserializer.Deserialize(packetString));
        }
        catch (Exception e)
        {
            return e;
        }
    }
    /// 
    public Serializer Serializer => _serializer;
    /// 
    public Deserializer Deserializer => _deserializer;
}