//public bool SendNotification(int id, bool hasNewData)
        //{
        //	var context = new ShopConnectorRequestContext()
        //	{
        //		ActionMethod = "Notification",
        //		HttpMethod = "POST",
        //		RequestContent = "{0}={1}".FormatInvariant(ShopConnectorCore.Xml.HasNewData, hasNewData.ToString())
        //	};

        //	bool success = SendRequest(context, id);
        //	return success;
        //}

        //public void ProcessNotification()
        //{
        //	var request = HttpContext.Current.Request;
        //	string publicKey = request.Headers[ShopConnectorCore.Header.PublicKey];
        //	var controllingData = ShopConnectorCaching.ControllingData();

        //	var connection = controllingData.Connections.FirstOrDefault(x => x.PublicKey == publicKey && !x.IsForExport);
        //	if (connection != null)
        //	{
        //		controllingData.ConnectionsUpdated = true;
        //		connection.HasNewData = request.Form[ShopConnectorCore.Xml.HasNewData].ToBool();
        //	}
        //}

        public DataExportResult Export(ShopConnectorExportContext context, CancellationToken token, string providerSystemName)
        {
            var provider = _exportProfileService.Value.LoadProvider(providerSystemName);
            var profile  = _exportProfileService.Value.GetSystemExportProfile(providerSystemName);

            if (profile == null)
            {
                profile = _exportProfileService.Value.InsertExportProfile(provider, true);
            }

            if (context.Connection == null)
            {
                var controllingData = ConnectionCache.ControllingData();
                var connection      = controllingData.Connections.FirstOrDefault(x => x.PublicKey == context.PublicKey && x.IsForExport);
                context.Connection = _connectionRepository.GetById(connection.Id);
            }

            var limitedToStoreIds = context.Connection.LimitedToStoreIds.ToIntArray();
            var domain            = _shopConnectorSettings.EnableSkuMapping
                ? context.Connection.Url.ToDomain()
                : string.Empty;

            var request = new DataExportRequest(profile, provider);

            request.CustomData.Add(ShopConnectorCore.Header.PublicKey, context.PublicKey);
            request.CustomData.Add("CategoryIds", context.CategoryIds);
            request.CustomData.Add("StoreIds", limitedToStoreIds);
            request.CustomData.Add("Domain", domain);
            request.HasPermission = true;

            if (providerSystemName == ShopConnectorProductXmlExportProvider.SystemName)
            {
                var fetchFrom = context.Model.FetchFrom.ToDateTimeIso8601();
                var limitedToManufacturerIds = context.Connection.LimitedToManufacturerIds.ToIntArray();

                request.ProductQuery = GetProductQuery(
                    limitedToManufacturerIds,
                    limitedToStoreIds,
                    context.Model.FilterManufacturerIds,
                    context.Model.FilterCategoryId.ToInt(),
                    fetchFrom);
            }

            var result = _dataExporter.Value.Export(request, token);

            return(result);
        }
        public void Import(ProductImportModel model)
        {
            var controllingData = ConnectionCache.ControllingData();

            if (!controllingData.IsImportEnabled)
            {
                _services.Notifier.Error(T("Plugins.SmartStore.ShopConnector.ImportNotActive"));
                return;
            }

            if (_asyncState.Exists <ShopConnectorProcessingInfo>(ShopConnectorPlugin.SystemName))
            {
                _asyncState.Remove <ShopConnectorProcessingInfo>(ShopConnectorPlugin.SystemName);
            }

            var utcNow = DateTime.UtcNow;
            var state  = new ShopConnectorImportState
            {
                ImportCategories         = model.ImportCategories,
                ImportAll                = model.ImportAll,
                ImportFile               = model.ImportFile,
                UpdateExistingProducts   = model.UpdateExistingProducts,
                UpdateExistingCategories = model.UpdateExistingCategories,
                DeleteImportFile         = model.DeleteImportFile,
                TaxCategoryId            = model.TaxCategoryId,
                LimitedToStores          = model.LimitedToStores,
                EventPublishEntityCount  = 100,
                Publish               = model.Publish,
                DisableBuyButton      = model.DisableBuyButton,
                DisableWishlistButton = model.DisableWishlistButton
            };

            try
            {
                state.IgnoreEntityNames = _shopConnectorSettings.IgnoreEntityNames
                                          .SplitSafe(",")
                                          .Select(x => x.TrimSafe())
                                          .ToList();

                if (model.SelectedStoreIds != null && model.SelectedStoreIds.Any())
                {
                    state.SelectedStoreIds = model.SelectedStoreIds.ToList();
                }

                if (!model.ImportAll && !string.IsNullOrWhiteSpace(model.SelectedProductIds))
                {
                    state.SelectedProductIds = model.SelectedProductIds.SplitSafe(",").Select(x => x.ToInt()).ToDictionarySafe(x => x, x => 0);
                }

                var task = AsyncRunner.Run((c, ct, x) =>
                {
                    var obj = x as ShopConnectorImportState;
                    c.Resolve <IShopConnectorImportService>().StartProductImport(obj);
                }, state);

                _services.Notifier.Information(new LocalizedString(T("Plugins.SmartStore.ShopConnector.ImportInProgress")));

                task.Wait(500);
            }
            catch (Exception ex)
            {
                _services.Notifier.Error(ex.ToAllMessages());
                Logger.Error(ex);
            }
        }
        public bool SendRequest(ShopConnectorRequestContext context, int id)
        {
            try
            {
                string val;
                var    controllingData = ConnectionCache.ControllingData();
                var    connection      = controllingData.Connections.FirstOrDefault(x => x.Id == id);
                context.Version    = controllingData.Version;
                context.Connection = connection;

                Debug.Assert(!connection.IsForExport || (connection.IsForExport && context.ActionMethod.IsCaseInsensitiveEqual("Notification")),
                             "Import connection must be used to consume data.", "");

                if (!connection.IsActive)
                {
                    context.ResponseModel = new OperationResultModel(T("Plugins.SmartStore.ShopConnector.ConnectionNotActive"));
                    return(false);
                }

                if (!controllingData.IsImportEnabled)
                {
                    context.ResponseModel = new OperationResultModel(T("Plugins.SmartStore.ShopConnector.ImportNotActive"));
                    return(false);
                }

                context.PublicKey      = connection.PublicKey;
                context.SecretKey      = connection.SecretKey;
                context.HttpAcceptType = "application/atom+xml,application/atomsvc+xml,application/xml";

                if (context.Url.IsEmpty())
                {
                    context.Url = connection.Url.GetEndpointUrl(context.ActionMethod);
                }
                if (context.HttpMethod.IsEmpty())
                {
                    context.HttpMethod = "GET";
                }

                if (context.ActionMethod == "About")
                {
                    var fs = new ShopConnectorFileSystem("About");
                    context.ResponsePath = fs.GetFullFilePath(string.Concat("about-", Guid.NewGuid().ToString(), ".xml"));
                }
                else if (context.ActionMethod == "ProductData")
                {
                    context.ResponsePath = new ShopConnectorFileSystem("Product").GetFilePath(context.RequestContent["DataFileName"]);
                }

                var consumer = new ShopConnectorConsumer();
                var request  = consumer.StartRequest(context);
                consumer.ProcessResponse(context, request);

                context.Success = context.ResponseModel == null;
                if (context.Success)
                {
                    controllingData.ConnectionsUpdated = true;

                    if (context.Headers.TryGetValue("Sm-ShopConnector-RequestCount", out val) && long.TryParse(val, out var requestCount))
                    {
                        connection.RequestCount = requestCount;
                    }
                    if (context.Headers.TryGetValue("Sm-ShopConnector-LastRequest", out val))
                    {
                        connection.LastRequestUtc = val.ToDateTimeIso8601();
                    }
                    if (context.Headers.TryGetValue("Sm-ShopConnector-LastProductCall", out val))
                    {
                        connection.LastProductCallUtc = val.ToDateTimeIso8601();
                    }
                }

                ShopConnectorFileSystem.CleanupDirectories();
            }
            catch (Exception ex)
            {
                context.Success       = false;
                context.ResponseModel = new OperationResultModel(ex);
            }

            return(context.Success);
        }