using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WebSocket.Clients
{
    public class Auth
    {
        public string Key { get; set; }
        public string Signature { get; set; }
        public long Timestamp { get; set; }

        public void CreateSignature(string secret, DateTime? now = null)
        {
            Timestamp = GetTimestamp(now ?? DateTime.UtcNow);

            Signature = ComputeHash(secret, Timestamp + Key);
        }
        private static readonly long _InitialJavaScriptDateTicks = 621355968000000000;
        private long GetTimestamp(DateTime time)
        {
            long javaScriptTicks = (time.Ticks - _InitialJavaScriptDateTicks) / 10000 / 1000;
            return javaScriptTicks;
        }
        private static string ComputeHash(string apiKey, string message)
        {
            var key = Encoding.UTF8.GetBytes(apiKey);
            string hashString;
            using (var hmac = new System.Security.Cryptography.HMACSHA256(key))
            {
                var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
                hashString = String.Concat(hash.Select(x => x.ToString("x2")));
            }

            return hashString;
        }
    }
    public class AuthRequest
    {
        public string E { get { return "auth"; } }
        public Auth Auth { get; set; }
    }
}
