using System;
using System.Text;
namespace SocketHttpListener
{
    /// 
    /// Contains the event data associated with a  event.
    /// 
    /// 
    /// A  event occurs when the  receives
    /// a text or binary data frame.
    /// If you want to get the received data, you access the  or
    ///  property.
    /// 
    public class MessageEventArgs : EventArgs
    {
        #region Private Fields
        private string _data;
        private Opcode _opcode;
        private byte[] _rawData;
        #endregion
        #region Internal Constructors
        internal MessageEventArgs(Opcode opcode, byte[] data)
        {
            _opcode = opcode;
            _rawData = data;
            _data = convertToString(opcode, data);
        }
        internal MessageEventArgs(Opcode opcode, PayloadData payload)
        {
            _opcode = opcode;
            _rawData = payload.ApplicationData;
            _data = convertToString(opcode, _rawData);
        }
        #endregion
        #region Public Properties
        /// 
        /// Gets the received data as a .
        /// 
        /// 
        /// A  that contains the received data.
        /// 
        public string Data => _data;
        /// 
        /// Gets the received data as an array of .
        /// 
        /// 
        /// An array of  that contains the received data.
        /// 
        public byte[] RawData => _rawData;
        /// 
        /// Gets the type of the received data.
        /// 
        /// 
        /// One of the  values, indicates the type of the received data.
        /// 
        public Opcode Type => _opcode;
        #endregion
        #region Private Methods
        private static string convertToString(Opcode opcode, byte[] data)
        {
            return data.Length == 0
                   ? string.Empty
                   : opcode == Opcode.Text
                     ? Encoding.UTF8.GetString(data, 0, data.Length)
                     : opcode.ToString();
        }
        #endregion
    }
}