using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Win32;
using SuperDog;

namespace XKRS.Common.Model.Authority
{
    public static class AuthorityCheck
    {
        public static Timer AuthorityCheckTimer = null;
        public static UdpClient RemoteCheckClient = null;//提供用户数据报协议（Udp）网络服务
        static byte[] CHECKBUFFER = null;
        static IPEndPoint AuthorityServer = null;//将网络终结点表示为IP地址和端口号
        public static bool IsAuthorityOK { get; set; } = false;//是否批准 静态属性 默认初值为false
        static bool _isCheckAuthorityNecessary = true;

        static AuthorityCheck()
        {
            //AuthorityCheckTimer = new Timer(OnAuthorityCheck, null, 0, 1000 * 60);
            RemoteCheckClient = new UdpClient();
            //获取或设置 System.Boolean 值，该值指定是否 System.Net.Sockets.UdpClient 可能会发送或接收广播的数据包。
            RemoteCheckClient.EnableBroadcast = true;
            //获取或设置一个值，指定的后的时间量同步 Overload:System.Net.Sockets.Socket.Receive 调用将会超时。
            RemoteCheckClient.Client.ReceiveTimeout = 1000;

            CHECKBUFFER = Encoding.UTF8.GetBytes("AuthorityCheck");

            //string checkStr = ConfigurationManger.AppSettings["AuthorityCheck"];
        }


        private static void OnAuthorityCheck(object state)
        {
            AuthorityCheckOperation();
        }
        public static bool AuthorityCheckOperation()
        {
            if (!_isCheckAuthorityNecessary)
            {
                IsAuthorityOK = true;
            }
            else
            {
                DogFeature feature = new DogFeature(1);
                DogStatus status = DogStatus.StatusOk;
                using(var dog=new Dog(feature))
                {
                    string vendorCodes = "FIgWctNxfC4kOOrFk52ktOm6JBRreMTI2ckQRUwjJmzstXN2awbyKGfjdlWcKFpjMiJRwirzPlJKSThN1nC7axSY4Y9l5+aRzCYI8WoYFmtx4zBx2n1fQ9Rb/CGk99Z9mM5mpZQVH+PGmZGsEjfSBdY12HjIcPVHGmMyecskMlhIGxDqUg8ndCk8/0fqexKbQCffDiGAPbxZgxKlRAnxJFOwd1V2Hmq3Iln1YNhyRRbgudU7kPCY/RsxBKXtL4wym96d2jQNDcKV8A5Anb4UlSLbac7OcrCZEBSUTpMjyDYRvDWFWTmfVKX9/vuI4VvKjr2t/wt01Nu0tQ0a4AVtQZk+l13WZkwkkeOUh6gtvVFJZH61hpwhOOjnN9dNw8WSYBYC/NyaMjiv7yRVHt9K/Bs76T8I0ias55BP1GXe6C+zGJ9KXK+baCLojMTObj3Bs9JFhDwEDgEjRDCxz9POZnE3XPe/2ET4KbRP5cXZsX7rxbnwQ33E/cKcG1hidG3RTLu7d+IRob9vgpeeUYXB8OHSoReJBsjhJEWBCDko9YnTb1FcO0YwPQdxW0BaVf1n6XAXlPUA6cGP552Kp3F0pcIxVKKGpYUeDL7oIFQrtnJ5aW7mB+/c35BDTCueM8wQIJ3b2KOI+lueC+dbhpHffVgtPnrh/atxcZxUoM2/KxjvniCYtUOKbeYh8Gqn1MDk1bAO2B9KNBrbGuWJpgDTfZunE/ZVtd09clExYJ8NW2Lw6pfNB3nbh1MlRUmmhQPIDubOnjiaBVbCQGF6Nm4/M0aIywSPJCMPaXK0sso5v+EDM4frryOPkvBEAbDyIuU+yQkO9vnYggKLAezyxZNxVqQgXcMaS0WyJxZxjFku7/Os8YU5z54DeOu6zDRD4zAjUKT7JIQcJKvtYGVB5lvirKDqISzDjsHcq4NJyQbQzg462y9o90ljUwCCMJrBmOw4NHpYKTNypN8aCsYmiebwag==";
                    status = dog.Login(vendorCodes, "<dogscope />");
                }
                if (status == DogStatus.StatusOk)
                {
                    IsAuthorityOK = true;
                }
                else
                {
                    IsAuthorityOK = false;
                    try
                    {
                        RemoteCheckClient.Send(CHECKBUFFER, CHECKBUFFER.Length, AuthorityServer);
                        IPEndPoint ep = null;
                        var recBuffer = RemoteCheckClient.Receive(ref ep);
                        var recStr = Encoding.UTF8.GetString(recBuffer);
                        IsAuthorityOK = (recStr == "AuthorityOK");
                    }
                    catch(Exception ex)
                    {
                        Console.WriteLine($"远程权限检测失败,{ex.Message}");
                    }
                }
            }
            return IsAuthorityOK;
        }

    }
}
