using FObjBase;
using FObjSysTest.Client;
using FObjSysTest.IService;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace Client_ConsoleApp
{
    class Program
    {
        static ObjAServiceClient objaClient;
        static void Main(string[] args)
        {
        
            objaClient = new ObjAServiceClient(0x12345600);

            FObjSys.Current.Connect_to_Another_OBJSys(
                new IPEndPoint(IPAddress.Loopback, 12345), objaClient.ID);

            objaClient.PropertyChanged += ObjaClient_PropertyChanged;

            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Interval = 10;
            timer.AutoReset = true;
            timer.Elapsed += Timer_Elapsed;
            timer.Start();

            System.Timers.Timer timer2 = new System.Timers.Timer();
            timer2.Interval = 1000;
            timer2.AutoReset = true;
            timer2.Elapsed += Timer2_Elapsed;
            //timer2.Start();

            Console.WriteLine("client --------------------");

            while (true)
            {
                string cmd = Console.ReadLine();
                Console.WriteLine($"cmd = {cmd}");
                if (cmd == "SetNumbers")
                {
                    double[] numbers = new double[20000];
                    for (int i = 0; i < numbers.Count(); i++)
                        numbers[i] = i;
                    objaClient.Numbers = numbers;
                    objaClient.Apply();
                }
                else if (cmd == "GetNumbers")
                {
                    Timer2_Elapsed(null, null);
                }
            }
        }
        static double tick = 0;

        static Stopwatch stopwatch = new Stopwatch();
        private static void Timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (stopwatch.IsRunning)
                return;
            stopwatch.Restart();
            
            objaClient.GetNumbers(tick++, (obj, retdata) =>
            {
                stopwatch.Stop();
                var reponse = retdata as Pack_CallGetNumbersReponse;
                Console.WriteLine($"GetNumbers Reponse reponse.numbers.Count()={reponse.numbers.Count()} stopwatch.ElapsedMilliseconds = {stopwatch.ElapsedMilliseconds}ms");
            }, null);
        }

        static bool mylock;
        private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (mylock != true)//不能让它能重入
            {
                mylock = true;
                FObjBase.PollModule.Current.OnPoll();
                mylock = false;
            }
        }

        private static void ObjaClient_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            
            Console.WriteLine($"e.PropertyName = {e.PropertyName}");
            if (e.PropertyName == "Numbers")
            {
                Console.WriteLine($"objaClient.Numbers.Count() = {objaClient.Numbers.Count()}");
            }
        }
    }
}