using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

using System.Text;
using System.Threading;
using System.Threading.Tasks;

using WebSocket4Net;

// https://archive.codeplex.com/?p=websocket4net

namespace TopNugetPackages
{
    public class WebSocketMainDriver : ITopNugetPackages
    {
        private WebSocket websocket = null;

        private readonly string UserId = "TIM";
        private readonly string LoginKey = "sp";
        private readonly int AppId = 3;
        private readonly string VersionNo = "8.7";
        private readonly string ReleaseNo = "1.0";
        private readonly string BuildNo = "1.0";
        private readonly string SystemId = "SP_F";
        private readonly int LangNo = 0;

        private bool _loggedIn = false;

        public WebSocketMainDriver()
        {
            websocket = new WebSocket("ws://192.168.123.136:8063/");
            websocket.Opened += Websocket_Opened;
            websocket.Error += Websocket_Error;
            websocket.Closed += Websocket_Closed;
            websocket.MessageReceived += Websocket_MessageReceived;
            websocket.DataReceived += Websocket_DataReceived;
            websocket.Open();
        }

        private void Websocket_Error(object sender, SuperSocket.ClientEngine.ErrorEventArgs e)
        {
        }

        private void Websocket_Closed(object sender, EventArgs e)
        {
        }

        private void Websocket_Opened(object sender, EventArgs e)
        {
            // login
            var LoginTime = DateTime.Now.ToFileTime();
            var loginStr = string.Format($"4104,0,{UserId},{LoginKey},{AppId},{VersionNo},{ReleaseNo},{BuildNo},{SystemId},{LoginTime},{LangNo}\r\n");
            websocket.Send(loginStr);
        }

        private void Websocket_DataReceived(object sender, DataReceivedEventArgs e)
        {
            var str = Encoding.Default.GetString(e.Data);
            if (str != null)
                HandleReceived(str);
        }

        private void Websocket_MessageReceived(object sender, MessageReceivedEventArgs e)
        {
            HandleReceived(e.Message);
        }

        private void OnError(object sender, SuperSocket.ClientEngine.ErrorEventArgs e)
        {
        }

        private void HandleReceived(string data)
        {
            if (data.StartsWith("4104"))
            {
                if (data.EndsWith("0\r\n"))
                {
                    _loggedIn = true;
                    websocket.Send("4107,0,HSIH1,0,1,0");   // subscribe price
                }
            }
            else if (data.StartsWith("4102"))
            {
                Console.WriteLine(data);    // price response data
            }
        }

        // Sample to use Websocket4Net
        // Connect, send and receive data
        public void DoIt()
        {
            Thread.Sleep(100000);
        }
    }
}