﻿using System;
using BeardedManStudios.Network;

namespace Dissonance.Integrations.ForgeNetworking
{
    public struct ForgePeer
        : IEquatable<ForgePeer>
    {
        [CanBeNull]public readonly NetworkingPlayer Peer;

        public ForgePeer([NotNull] NetworkingPlayer peer)
            : this()
        {
            if (peer == null)
                throw new ArgumentNullException("peer");

            Peer = peer;
        }

        public bool Equals(ForgePeer other)
        {
            var pn = Peer == null;
            var on = other.Peer == null;

            //Both null?
            if (pn && on)
                return true;

            //One null?
            if (pn ^ on)
                return false;

            //Neither null, genuine comparison
            return Peer.NetworkId == other.Peer.NetworkId;
        }

        public override bool Equals([CanBeNull] object obj)
        {
            if (ReferenceEquals(null, obj))
                return false;
            return obj is ForgePeer && Equals((ForgePeer)obj);
        }

        public override int GetHashCode()
        {
            return (Peer != null ? Peer.GetHashCode() : 0);
        }

        public static bool operator ==(ForgePeer left, ForgePeer right)
        {
            return left.Equals(right);
        }

        public static bool operator !=(ForgePeer left, ForgePeer right)
        {
            return !left.Equals(right);
        }
    }
}
