using System;
using ZeroLevel.Models;

namespace ZeroLevel.Network.FileTransfer
{
    public sealed class FileReceiver
    {
        private readonly string _baseFolder;
        private readonly ClientFolderNameMapper _nameMapper;
        private readonly FileWriter _receiver;

        public FileReceiver(IRouter router, string baseFolder, ClientFolderNameMapper nameMapper)
        {
            _baseFolder = baseFolder ?? throw new Exception(nameof(baseFolder));
            _nameMapper = nameMapper ?? throw new Exception(nameof(nameMapper));
            _receiver = new FileWriter(baseFolder);

            if (false == router.ContainsRequestorInbox("__file_transfer_start_transfer__"))
            {
                router.RegisterInbox<FileStartFrame, InvokeResult>("__file_transfer_start_transfer__",
                    (c, f) => _receiver.Incoming(f, nameMapper(c)));
            }
            if (false == router.ContainsRequestorInbox("__file_transfer_frame__"))
            {
                router.RegisterInbox<FileFrame, InvokeResult>("__file_transfer_frame__", 
                    (_, f) => _receiver.Incoming(f));
            }
            if (false == router.ContainsRequestorInbox("__file_transfer_complete_transfer__"))
            {
                router.RegisterInbox<FileEndFrame, InvokeResult>("__file_transfer_complete_transfer__", 
                    (_, f) => _receiver.Incoming(f));
            }
            if (false == router.ContainsRequestorInbox("__file_transfer_ping__"))
            {
                router.RegisterInbox<bool>("__file_transfer_ping__", (_) => true);
            }
        }
    }
}