using System;
using System.Collections.Generic;
using System.Data;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.IOCore;
using Aitex.Core.UI.ControlDataContext;
using Aitex.Core.Util;
using Aitex.Core.WCF;
using Aitex.Sorter.Common;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.ControlDataContext;
using MECF.Framework.Common.DBCore;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.IOCore;
using MECF.Framework.Common.SubstrateTrackings;
using CyberX8_Core;
using VenusCommon;

namespace MECF.Framework.Common.DataCenter
{
    public class QueryDataClient : Singleton<QueryDataClient>
    {
        public bool InProcess { get; set; }

        private IQueryDataService _service;
        public IQueryDataService Service
        {
            get
            {
                if (_service == null)
                {
                    if (InProcess)
                        _service = new QueryDataService();
                    else
                        _service = new QueryDataServiceClient();
                }

                return _service;
            }
        }
    }

    public class QueryDataServiceClient : ServiceClientWrapper<IQueryDataService>, IQueryDataService
    {
        public QueryDataServiceClient()
            : base("Client_IQueryDataService", "QueryDataService")
        {
        }

        public Dictionary<string, object> PollData(IEnumerable<string> keys)
        {
            Dictionary<string, object> result = null;
            Invoke(svc => { result = svc.PollData(keys); });
            return result;
        }

        public Dictionary<string, object> PollConfig(IEnumerable<string> keys)
        {
            Dictionary<string, object> result = null;
            Invoke(svc => { result = svc.PollConfig(keys); });
            return result;
        }

        public object GetData(string key)
        {
            object result = null;
            Invoke(svc => { result = svc.GetData(key); });
            return result;
        }

        public object GetConfig(string key)
        {
            object result = null;
            try
            {
                Invoke(svc => { result = svc.GetConfig(key); });
            }
            catch(Exception ex)
            {
            }
            return result;
        }

        public string GetConfigFileContent( )
        {
            string result = null;
            Invoke(svc => { result = svc.GetConfigFileContent(); });
            return result;
        }
        public List<EventItem> QueryDBEvent(string sql)
        {
            List<EventItem> result = null;
            Invoke(svc => { result = svc.QueryDBEvent(sql); });
            return result;
        }

        public List<HistoryCarrierData> QueryDBCarrier(string sql)
        {
            List<HistoryCarrierData> result = null;
            Invoke(svc => { result = svc.QueryDBCarrier(sql); });
            return result;
        }

        public List<HistoryProcessData> QueryDBProcess(string sql)
        {
            List<HistoryProcessData> result = null;
            Invoke(svc => { result = svc.QueryDBProcess(sql); });
            return result;
        }

        public List<HistoryWaferData> QueryDBWafer(string sql)
        {
            List<HistoryWaferData> result = null;
            Invoke(svc => { result = svc.QueryDBWafer(sql); });
            return result;
        }

        public List<HistoryMoveData> QueryDBMovement(string sql)
        {
            List<HistoryMoveData> result = null;
            Invoke(svc => { result = svc.QueryDBMovement(sql); });
            return result;
        }

        public List<HistoryJobMoveData> QueryDBJobMovementByJobGuid(string jobGuid)
        {
	        List<HistoryJobMoveData> result = null;
	        Invoke(svc => { result = svc.QueryDBJobMovementByJobGuid( jobGuid); });
	        return result;
        }

        public List<HistoryJobMoveData> QueryDBJobMovementByJobGuidAndStationName(string jobGuid, string stationName)
        {
	        List<HistoryJobMoveData> result = null;
	        Invoke(svc => { result = svc.QueryDBJobMovementByJobGuidAndStationName( jobGuid, stationName); });
	        return result;
        }

		public List<HistoryDataItem> GetOneDayHistoryData(IEnumerable<string> keys, DateTime begin, string module)
        {
	        List<HistoryDataItem> result = null;
	        Invoke(svc => { result = svc.GetOneDayHistoryData(keys,begin, module); });
	        return result;
        }

        public List<HistoryDataItem> GetHistoryDataFromStartToEnd(IEnumerable<string> keys, DateTime begin,DateTime end, string module)
        {
	        List<HistoryDataItem> result = null;
	        Invoke(svc => { result = svc.GetHistoryDataFromStartToEnd(keys, begin, end,module); });
	        return result;
        }

		public DataTable QueryData(string sql)
        {
            DataTable result = null;
            Invoke(svc => { result = svc.QueryData(sql); });
            return result;
        }

        public List<HistoryDataItem> GetHistoryData(IEnumerable<string> keys, string recipeRunGuid, string module)
        {
            List<HistoryDataItem> result = null;
            Invoke(svc => { result = svc.GetHistoryData(keys, recipeRunGuid, module); });
            return result;
        }

        public List<NotifiableIoItem> GetDiList(string key)
        {
            List<NotifiableIoItem> result = null;
            Invoke(svc => { result = svc.GetDiList(key); });
            return result;
        }

        public List<NotifiableIoItem> GetDoList(string key)
        {
            List<NotifiableIoItem> result = null;
            Invoke(svc => { result = svc.GetDoList(key); });
            return result;
        }

        public List<NotifiableIoItem> GetAiList(string key)
        {
            List<NotifiableIoItem> result = null;
            Invoke(svc => { result = svc.GetAiList(key); });
            return result;
        }

        public List<NotifiableIoItem> GetAoList(string key)
        {
            List<NotifiableIoItem> result = null;
            Invoke(svc => { result = svc.GetAoList(key); });
            return result;
        }

        public List<LeakCheckResultItem> GetHistoryLeakCheck(string Module)
        {
            List<LeakCheckResultItem> result = null;
            Invoke(svc =>
            {
                result = svc.GetHistoryLeakCheck(Module);
            });
            return result;
        }
        public List<PMLeakCheckResult> GetPMLeakCheckResult(string Module)
        {
            List<PMLeakCheckResult> result = null;
            Invoke(svc =>
            {
                result = svc.GetPMLeakCheckResult(Module);
            });
            return result;
        }
        public List<MFCVerificationData> GetMFCVerificationData(DateTime begin, DateTime end)
        {
            List<MFCVerificationData> result = null;
            Invoke(svc =>
            {
                result = svc.GetMFCVerificationData(begin,end);
            });
            return result;
        }
        public List<MFCVerificationOnePointData> GetMFCVerificationOnePointData()
        {
            List<MFCVerificationOnePointData> result = null;
            Invoke(svc =>
            {
                result = svc.GetMFCVerificationOnePointData();
            });
            return result;
        }
        public List<MFCVerificationTenPointsData> GetMFCVerificationTenPointsData()
        {
            List<MFCVerificationTenPointsData> result = null;
            Invoke(svc =>
            {
                result = svc.GetMFCVerificationTenPointsData();
            });
            return result;
        }

        public List<HistoryStepItem> GetHistorySteps(DateTime begin, DateTime end)
        {
            List<HistoryStepItem> result = null;
            Invoke(svc =>
            {
                result = svc.GetHistorySteps(begin,end);
            });
            return result;
        }
        public List<OffsetItem> QueryOffsetDataByTime(string moduleName, DateTime from_time, DateTime to_time)
        {
            List<OffsetItem> result = null;
            Invoke(svc => { result = svc.QueryOffsetDataByTime(moduleName, from_time, to_time); });
            return result;
        }
        public List<UserItem> QueryAllUsers()
        {
            List<UserItem> result = new List<UserItem>();
            Invoke(svc => { result = svc.QueryAllUsers(); });
            return result;
        }
        public void InserUser(UserItem userItem)
        {
            Invoke(svc => { svc.InserUser(userItem); });
        }
        public void DeleteUser(string userName)
        {
            Invoke(svc => { svc.DeleteUser(userName); });
        }
        public void EditUser(UserItem userItem)
        {
            Invoke(svc => { svc.EditUser(userItem); });
        }
        public string GetTypedConfigContent(string type, string contentPath)
        {
            string result = "";
            Invoke(svc => { result = svc.GetTypedConfigContent(type, contentPath); });
            return result;
        }
        public void SetTypedConfigContent(string type, string contentPath, string content)
        {

            Invoke(svc => { svc.SetTypedConfigContent(type, contentPath, content); });

        }
    }
}