using System.Net.Sockets;

namespace NetCoreServer
{
    /// <summary>
    /// WebSocket interface
    /// </summary> 
    public interface IWebSocket
    {
        /// <summary>
        /// Handle WebSocket client connecting notification
        /// </summary>
        /// <remarks>Notification is called when WebSocket client is connecting to the server. You can handle the connection and change WebSocket upgrade HTTP request by providing your own headers.</remarks>
        /// <param name="request">WebSocket upgrade HTTP request</param>
        void OnWsConnecting(HttpRequest request) {}
        /// <summary>
        /// Handle WebSocket client connected notification
        /// </summary>
        /// <param name="response">WebSocket upgrade HTTP response</param>
        void OnWsConnected(HttpResponse response) {}

        /// <summary>
        /// Handle WebSocket server session validating notification
        /// </summary>
        /// <remarks>Notification is called when WebSocket client is connecting to the server. You can handle the connection and validate WebSocket upgrade HTTP request.</remarks>
        /// <param name="request">WebSocket upgrade HTTP request</param>
        /// <param name="response">WebSocket upgrade HTTP response</param>
        /// <returns>return 'true' if the WebSocket update request is valid, 'false' if the WebSocket update request is not valid</returns>
        bool OnWsConnecting(HttpRequest request, HttpResponse response) { return true; }
        /// <summary>
        /// Handle WebSocket server session connected notification
        /// </summary>
        /// <param name="request">WebSocket upgrade HTTP request</param>
        void OnWsConnected(HttpRequest request) {}

        /// <summary>
        /// Handle WebSocket client disconnecting notification
        /// </summary>
        void OnWsDisconnecting() {}
        /// <summary>
        /// Handle WebSocket client disconnected notification
        /// </summary>
        void OnWsDisconnected() {}

        /// <summary>
        /// Handle WebSocket received notification
        /// </summary>
        /// <param name="buffer">Received buffer</param>
        /// <param name="offset">Received buffer offset</param>
        /// <param name="size">Received buffer size</param>
        void OnWsReceived(byte[] buffer, long offset, long size) {}

        /// <summary>
        /// Handle WebSocket client close notification
        /// </summary>
        /// <param name="buffer">Received buffer</param>
        /// <param name="offset">Received buffer offset</param>
        /// <param name="size">Received buffer size</param>
        /// <param name="status">WebSocket close status (default is 1000)</param>
        void OnWsClose(byte[] buffer, long offset, long size, int status = 1000) {}

        /// <summary>
        /// Handle WebSocket ping notification
        /// </summary>
        /// <param name="buffer">Received buffer</param>
        /// <param name="offset">Received buffer offset</param>
        /// <param name="size">Received buffer size</param>
        void OnWsPing(byte[] buffer, long offset, long size) {}

        /// <summary>
        /// Handle WebSocket pong notification
        /// </summary>
        /// <param name="buffer">Received buffer</param>
        /// <param name="offset">Received buffer offset</param>
        /// <param name="size">Received buffer size</param>
        void OnWsPong(byte[] buffer, long offset, long size) {}

        /// <summary>
        /// Handle WebSocket error notification
        /// </summary>
        /// <param name="error">Error message</param>
        void OnWsError(string error) {}

        /// <summary>
        /// Handle socket error notification
        /// </summary>
        /// <param name="error">Socket error</param>
        void OnWsError(SocketError error) {}

        /// <summary>
        /// Send WebSocket server upgrade response
        /// </summary>
        /// <param name="response">WebSocket upgrade HTTP response</param>
        void SendUpgrade(HttpResponse response) {}
    }
}