using FishNet.Connection;
using FishNet.Managing;
using System;
using UnityEngine;

namespace FishNet.Authenticating
{
    /// <summary>
    /// When inherited from this can be used to create a custom authentication process before clients may communicate with the server.
    /// </summary>
    public abstract class Authenticator : MonoBehaviour
    {
        #region Public.
        /// <summary>
        /// True if this authenticator has been intiialzied.
        /// </summary>
        public bool Initialized { get; private set; }
        #endregion

        #region Protected.
        /// <summary>
        /// NetworkManager for this Authenticator.
        /// </summary>
        protected NetworkManager NetworkManager { get; private set; }
        #endregion

        /// <summary>
        /// Called when authenticator has concluded a result for a connection. Boolean is true if authentication passed, false if failed.
        /// Server listens for this event automatically.
        /// </summary>
        public abstract event Action<NetworkConnection, bool> OnAuthenticationResult;

        /// <summary>
        /// Initializes this script for use.
        /// </summary>
        /// <param name = "networkManager"></param>
        public virtual void InitializeOnce(NetworkManager networkManager)
        {
            NetworkManager = networkManager;
            Initialized = true;
        }

        /// <summary>
        /// Called on the server immediately after a client connects. Can be used to send data to the client for authentication.
        /// </summary>
        /// <param name = "connection">Connection which is not yet authenticated.</param>
        public virtual void OnRemoteConnection(NetworkConnection connection) { }
    }
}