﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Text.RegularExpressions;
using System.Timers;


namespace AutobotServer
{
    public class ServerManager
    {
        #region Data
        private BindingList<ServerInstance> m_ServerList;
        private int m_iTotalNewInstanceCounter;
        private Form1 m_pParentForm;
        private ServerListenerCaller m_ServerListener;
        private System.Net.Sockets.TcpListener m_TcpListener;
        private BindingList<StatusPair> m_lGlobalStats;
        #endregion // Data

        public ServerManager(Form1 a_pParentForm)
        {
            m_ServerList = new BindingList<ServerInstance>();
            m_iTotalNewInstanceCounter = 0;
            m_pParentForm = a_pParentForm;
            m_lGlobalStats = new BindingList<StatusPair>();

            int iPort = Properties.Settings.Default.ListenPort;
            m_TcpListener = new System.Net.Sockets.TcpListener(iPort);
            m_ServerListener = new ServerListenerCaller(a_pParentForm);
            m_ServerListener.ServerTcpListener = m_TcpListener;
            m_ServerListener.SocketOpenedReceiver += new SocketOpenedHandler(this.NewServerConnected);
            m_ServerListener.Start();
        }

        #region Server management
        public void ServerInstanceDied(ServerInstance aInstance)
        {
            m_ServerList.Remove(aInstance);
        }
        public void NewServerConnected(object sender, SocketReceivedEventArgs e)
        {
            ServerInstance oNew = new ServerInstance(m_iTotalNewInstanceCounter++, e.m_Socket, m_pParentForm, this);
            m_ServerList.Add(oNew);
        }
        public void KillAll()
        {
            m_ServerListener.Cancel();
            foreach(var oServer in m_ServerList)
            {
                oServer.Cancel();
            }

        }

        private void AddStat(StatusPair aPair)
        {
            if(0==aPair.CurrentCount)
            {
                return;
            }
            int iInsertIndex = m_lGlobalStats.Count;
            int iIndex = 0;
            foreach (var oPair in m_lGlobalStats)
            {
                if (oPair.Status.Equals(aPair.Status))
                {
                    oPair.CurrentCount = oPair.CurrentCount + aPair.CurrentCount;
                    return;
                }
                if (aPair.Status.CompareTo(oPair.Status) < 0 && iInsertIndex > iIndex)
                {
                    iInsertIndex = iIndex;
                }
                ++iIndex;
            }
            m_lGlobalStats.Insert(iInsertIndex, new StatusPair(aPair.Status, aPair.CurrentCount));
        }

        public void RefreshStats()
        {
            m_lGlobalStats.Clear();
            //foreach (var oPair in m_lGlobalStats)
            //{
            //    oPair.CurrentCount = 0;
            //}

            foreach (var oServer in m_ServerList)
            {
                foreach (var oPair in oServer.m_lStats)
                {
                    AddStat(oPair);
                }
            }
        }
        #endregion // Server management

        #region Ui Interface Helper
        public void BindingServerList(DataGridView a_dgManagers, DataGridView a_dgTotalStats)
        {
            a_dgManagers.DataSource = null;
            a_dgManagers.DataSource = m_ServerList;

            a_dgTotalStats.DataSource = null;
            a_dgTotalStats.DataSource = m_lGlobalStats;
        }
        #endregion Ui Interface Helper
    }
}
