﻿using System;
using Dissonance.Networking;

namespace Dissonance.Integrations.PhotonUnityNetworking
{
    public class PhotonClient
        : BaseClient<PhotonServer, PhotonClient, int>, PhotonCommsNetwork.IPhotonPacketCallback
    {
        private readonly PhotonCommsNetwork _network;

        private readonly RaiseEventOptions _sendOptions = new RaiseEventOptions {
            Receivers = ReceiverGroup.MasterClient
        };

        public PhotonClient(PhotonCommsNetwork network)
            : base(network)
        {
            _network = network;
        }

        public override void Connect()
        {
            _network.RegisterPacketListener(_network.EventCodeToClient, this);
            _sendOptions.SequenceChannel = (byte)(PhotonNetwork.networkingPeer.ChannelCount - 1);

            Connected();
        }

        protected override void ReadMessages()
        {
            //Messages are received in an event handler, so we don't need to do any work to read events
        }

        public void PacketDelivered(byte eventcode, ArraySegment<byte> data, int senderid)
        {
            //Skip events we don't care about
            if (eventcode != _network.EventCodeToClient)
                return;

            NetworkReceivedPacket(data);
        }

        protected override void SendReliable(ArraySegment<byte> packet)
        {
            _network.Send(packet, _network.EventCodeToServer, _sendOptions, true);
        }

        protected override void SendUnreliable(ArraySegment<byte> packet)
        {
            _network.Send(packet, _network.EventCodeToServer, _sendOptions, false);
        }
    }
}
