using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace ProcessFileSyncService
{
    public partial class FileSyncService : ServiceBase
    {
        Dictionary<string, Type> SynchronizerMap = new Dictionary<string, Type>();
        List<FileSynchronizers.IFileSynchronizer> Synchronizers = new List<FileSynchronizers.IFileSynchronizer>();

        public FileSyncService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                LoadSynchronizers();

                QMAPP.FJC.BLL.Basic.MachineInfoBLL machinebll = new QMAPP.FJC.BLL.Basic.MachineInfoBLL();
                var machineList = machinebll.GetAllMachineInfoList();
                foreach (var machine in machineList)
                {
                    if (SynchronizerMap.ContainsKey(machine.EQUIPMENT_TYPE_CODE + ""))
                    {
                        var synctype = SynchronizerMap[machine.EQUIPMENT_TYPE_CODE + ""];
                        var filesync = (FileSynchronizers.IFileSynchronizer)Activator.CreateInstance(synctype, machine);
                        filesync.Start();
                        Synchronizers.Add(filesync);
                    }
                }
                QMFrameWork.Log.LogManager.LogHelper.Info(
                    new QMFrameWork.Log.LogInfo { ClientIP = "localhost", UserName = "admin", Info = "服务启动完成" });
            }
            catch (Exception ex)
            {
                QMFrameWork.Log.LogManager.LogHelper.Error(
                                   new QMFrameWork.Log.LogInfo { Info = "服务启动失败!", ErrorInfo = ex });
            
            }
        }

        protected override void OnStop()
        {
            foreach (var sync in Synchronizers)
            {
                sync.Stop();
            }
        }

        internal void TestStart()
        {
            LoadSynchronizers();

            QMAPP.FJC.BLL.Basic.MachineInfoBLL machinebll = new QMAPP.FJC.BLL.Basic.MachineInfoBLL();
            var machineList= machinebll.GetAllMachineInfoList();
            foreach (var machine in machineList)
            {
                if (SynchronizerMap.ContainsKey(machine.EQUIPMENT_TYPE_CODE+""))
                {
                    var synctype = SynchronizerMap[machine.EQUIPMENT_TYPE_CODE+""];
                    var filesync= (FileSynchronizers.IFileSynchronizer)Activator.CreateInstance(synctype, machine);
                    filesync.Start();
                    Synchronizers.Add(filesync);
                }
            }
        }

        private void LoadSynchronizers()
        {
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.Load(AppDomain.CurrentDomain.BaseDirectory+"SynchronizerMap.xml");

            var nodes = doc.SelectNodes("Synchronizers/Synchronizer");

            foreach (System.Xml.XmlNode node in nodes)
            {
                var equiptype = node.Attributes["EquipmentType"].Value;
                var assembly = System.Reflection.Assembly.Load(node.Attributes["AssemblyName"].Value);
                var type = assembly.GetType(node.Attributes["ClassName"].Value);
                if (type != null)
                {
                    if (!SynchronizerMap.ContainsKey(equiptype))
                    {
                        SynchronizerMap.Add(equiptype, type);
                    }
                }
            }
        }
    }
}