// User management functions
        //
        public static void ProvisionNewUserAccount()
        {
            Console.WriteLine(
                Environment.NewLine + "Enter New User's Email Address (which will be used as User ID)");
            var email = Console.ReadLine();

            Console.WriteLine(Environment.NewLine + "Enter New User's Shopify Domain");
            var domain = Console.ReadLine();

            var msg = $"Create a new Account for User ID: {email} - Shopify Domain: {domain}";

            if (!CommandLineFuncs.Confirm(msg))
            {
                return;
            }

            Action <ILifetimeScope> process = scope =>
            {
                var service = scope.Resolve <ProvisioningService>();
                var user    = service.ProvisionNewAccount(email, domain).Result;
                Console.WriteLine(Environment.NewLine + "Created User...");
            };

            AutofacRunner.RunInScope(process);
        }
        public static void RunViewAcumaticaTaxTransfer()
        {
            var instanceId    = CommandLineFuncs.SolicitInstanceId();
            var salesOrderNbr = CommandLineFuncs.SolicitAcumaticaSalesOrderId();

            AutofacRunner.RunInScope(scope =>
            {
                var logger           = scope.Resolve <IPushLogger>();
                var instanceContext  = scope.Resolve <InstanceContext>();
                var acumaticaContext = scope.Resolve <AcumaticaHttpContext>();
                var salesOrderClient = scope.Resolve <SalesOrderClient>();

                instanceContext.Initialize(instanceId);

                acumaticaContext.SessionRun(() =>
                {
                    var json = salesOrderClient
                               .RetrieveSalesOrder(salesOrderNbr, SalesOrderType.SO, Expand.Details_Totals);

                    var salesOrderObj = json.ToSalesOrderObj();
                    var taxSnapshot   = salesOrderObj.custom.Document.UsrTaxSnapshot;
                    var taxJson       = Compression.Unzip(taxSnapshot.value);

                    logger.Info("Acumatica Tax Transfer");
                    logger.Info(taxJson);
                });
            });
        }
        public static void EnableInstance()
        {
            var instanceId = CommandLineFuncs.SolicitInstanceId();

            AutofacRunner.RunInScope(scope =>
            {
                var repository = scope.Resolve <MasterRepository>();
                repository.UpdateInstanceEnabled(instanceId, true);
            });
        }
        public static void RunViewShopifyOrderAndTaxTransfer()
        {
            var instanceId     = CommandLineFuncs.SolicitInstanceId();
            var shopifyOrderId = CommandLineFuncs.SolicitShopifyId();

            AutofacRunner.RunInScope(scope =>
            {
                var logger          = scope.Resolve <IPushLogger>();
                var instanceContext = scope.Resolve <InstanceContext>();
                var shopifyOrderGet = scope.Resolve <ShopifyOrderGet>();
                var repository      = scope.Resolve <ShopifyOrderRepository>();
                var jsonService     = scope.Resolve <ShopifyJsonService>();


                instanceContext.Initialize(instanceId);

                shopifyOrderGet.Run(shopifyOrderId);
                var orderRecord  = repository.RetrieveOrder(shopifyOrderId);
                var shopifyOrder = jsonService.RetrieveOrder(orderRecord.ShopifyOrderId);

                logger.Info("Shopify Order JSON" + Environment.NewLine +
                            shopifyOrder.SerializeToJson() + Environment.NewLine);

                var taxTransfer = shopifyOrder.ToTaxTransfer();
                logger.Info("Shopify Tax Transfer: " + Environment.NewLine +
                            taxTransfer.SerializeToJson() + Environment.NewLine);

                var serializedTaxTransfer = taxTransfer.Serialize();
                logger.Info($"Shopify Tax Transfer Serialized:" + Environment.NewLine +
                            serializedTaxTransfer + Environment.NewLine);

                logger.Info($"Shopify Tax Transfer gzipped size: " +
                            $"{serializedTaxTransfer.ToBase64Zip().Length} bytes" +
                            Environment.NewLine);

                var deserializedTaxTransfer = serializedTaxTransfer.DeserializeTaxSnapshot();
                logger.Info($"Shopify Tax Transfer Deserialized:" + Environment.NewLine +
                            deserializedTaxTransfer.SerializeToJson() + Environment.NewLine);

                var lineItem = shopifyOrder.line_items[0];

                var testCalc = deserializedTaxTransfer.CalculateTax(lineItem.sku, lineItem.UnitPriceAfterDiscount, 1);

                logger.Info("Test Tax Calculation: " + Environment.NewLine +
                            testCalc.SerializeToJson() + Environment.NewLine);
            });
        }
        public static void RegisterInstance()
        {
            Console.WriteLine(Environment.NewLine + "Enter Instance database name:");
            var database = Console.ReadLine();

            if (!CommandLineFuncs.Confirm(
                    $"Are you sure you want to register database: {database} as an Instance?"))
            {
                return;
            }

            AutofacRunner.RunInScope(scope =>
            {
                var repository = scope.Resolve <MasterRepository>();
                repository.InsertInstance(database, true);
            });

            Console.WriteLine($"Database {database} registered as an Instance..." + Environment.NewLine);
        }
        public static void RunViewSalesPriceInquiry()
        {
            var instanceId = CommandLineFuncs.SolicitInstanceId();

            AutofacRunner.RunInScope(scope =>
            {
                var instanceContext    = scope.Resolve <InstanceContext>();
                var acumaticaContext   = scope.Resolve <AcumaticaHttpContext>();
                var distributionClient = scope.Resolve <DistributionClient>();
                var logger             = scope.Resolve <IPushLogger>();

                instanceContext.Initialize(instanceId);

                acumaticaContext.SessionRun(() =>
                {
                    var json = distributionClient.SalesPricesInquiry();
                    //logger.Info(json);
                });
            });
        }
        public static void RunShopifyOrderGetToAcumaticaOrderPut()
        {
            var instanceId     = CommandLineFuncs.SolicitInstanceId();
            var shopifyOrderId = CommandLineFuncs.SolicitShopifyId();

            AutofacRunner.RunInScope(scope =>
            {
                var instanceContext = scope.Resolve <InstanceContext>();
                instanceContext.Initialize(instanceId);

                Console.WriteLine($"Processing Shopify Order Id: {shopifyOrderId}");

                var shopifyOrderGet = scope.Resolve <ShopifyOrderGet>();
                var order           = shopifyOrderGet.Run(shopifyOrderId).order;

                var orderSync = scope.Resolve <AcumaticaOrderPut>();

                var acumaticaContext = scope.Resolve <AcumaticaHttpContext>();
                acumaticaContext.SessionRun(() => orderSync.RunOrder(shopifyOrderId));
            });
        }