using UnityEngine;
using UnityEngine.SceneManagement;
using Mirror;
/*
    Documentation: https://mirror-networking.gitbook.io/docs/components/network-authenticators
    API Reference: https://mirror-networking.com/docs/api/Mirror.NetworkAuthenticator.html
*/
public class #SCRIPTNAME# : NetworkAuthenticator
{
    #region Messages
    public struct AuthRequestMessage : NetworkMessage { }
    public struct AuthResponseMessage : NetworkMessage { }
    #endregion
    #region Server
    /// 
    /// Called on server from StartServer to initialize the Authenticator
    /// Server message handlers should be registered in this method.
    /// 
    public override void OnStartServer()
    {
        // register a handler for the authentication request we expect from client
        NetworkServer.RegisterHandler(OnAuthRequestMessage, false);
    }
    /// 
    /// Called on server from OnServerAuthenticateInternal when a client needs to authenticate
    /// 
    /// Connection to client.
    public override void OnServerAuthenticate(NetworkConnection conn) { }
    /// 
    /// Called on server when the client's AuthRequestMessage arrives
    /// 
    /// Connection to client.
    /// The message payload
    public void OnAuthRequestMessage(NetworkConnection conn, AuthRequestMessage msg)
    {
        AuthResponseMessage authResponseMessage = new AuthResponseMessage();
        conn.Send(authResponseMessage);
        // Accept the successful authentication
        ServerAccept(conn);
    }
    #endregion
    #region Client
    /// 
    /// Called on client from StartClient to initialize the Authenticator
    /// Client message handlers should be registered in this method.
    /// 
    public override void OnStartClient()
    {
        // register a handler for the authentication response we expect from server
        NetworkClient.RegisterHandler(OnAuthResponseMessage, false);
    }
    /// 
    /// Called on client from OnClientAuthenticateInternal when a client needs to authenticate
    /// 
    public override void OnClientAuthenticate()
    {
        AuthRequestMessage authRequestMessage = new AuthRequestMessage();
        NetworkClient.Send(authRequestMessage);
    }
    /// 
    /// Called on client when the server's AuthResponseMessage arrives
    /// 
    /// The message payload
    public void OnAuthResponseMessage(AuthResponseMessage msg)
    {
        // Authentication has been accepted
        ClientAccept();
    }
    #endregion
}