public ExtendedTenant CreateTenant(Tenant tenant, string tenantToBeCopied = "")
        {
            int homeId, mediaId, sliderBannersId, myAccountId, editMyAccountId, documentsId, marketingPreferencesId, withdrawId, withdrawBankAccountsAndCardsId;
            int withdrawHistoryId, ticketsId, viewTicketId, depositId, depositBankAccountsAndCardsId, depositHistoryId, termsAndConditionsId, settingsId;
            int transactionHistoryId, helpId, loginProblemsId, depositAndWithdrawId;
            int H_registrationAndLoginId, H_depositId, H_withdrawId, H_myAccountId, H_betHistoryId, H_transactionHistoryId, H_sportsId, H_inplayId, H_casinoId, H_liveCasinoId, H_pokerId, H_faqId;
            int HA_registration, HA_login, HA_forgotUsername, HA_forgotPwd, HA_depositCardsAndBank, HA_depositCartipay, HA_depositCartipal, HA_depositHistory, HA_withdrawCardsAndBank, HA_withdraw, HA_withdrawHistory, HA_myAccount, HA_betHistory, HA_transactionHistory, HA_sportbook, HA_inplay;
            int betHistoryId, bonusHistoryId, sportId, inPlayId, casinoId, liveCasinoId, vegasId, lotteryId, pokerId, liveScheduleId, boardId, liveScoreId, overviewId, eventViewId, resultsId;
            int zeppelinId;
            int affiliateId;
            int bonusHistoryPageId;
            int loginPageId;
            var nodeHelper  = new NodeHelper();
            var homeTypeDoc = new HomeDocumentType(ConnectorContext.ContentTypeService, ConnectorContext.DataTypeService, ConnectorContext.FileService, ConnectorContext.Logger);
            var mediaNode   = new HomeMediaNode(ConnectorContext.MediaService, ConnectorContext.Logger, ConnectorContext.ContentTypeBaseService);

            homeNode.Validate(tenant);
            mediaNode.Validate(tenant);
            languageService.Validate(tenant);
            userGroupService.Validate(tenant, ignoreUser: true);
            apiService.Validate(tenant);

            if (tenantToBeCopied != "")
            {
                IContent tenantSourceNode = nodeHelper.GetTenantRoot(tenantToBeCopied);

                if (tenantSourceNode == null)
                {
                    throw new TenantException(ExceptionCode.TenantNotFound.CodeToString(), ExceptionCode.TenantNotFound, tenantToBeCopied);
                }

                //copy root node with all subnodes
                IContent newTenant = nodeHelper.CopyTenant(tenantSourceNode, tenantSourceNode.ParentId, tenant.TenantUId);

                homeNode.EditTenant(tenant);

                homeId = newTenant.Id;

                //Create new media folder
                mediaId         = mediaNode.CopyTenantMediaFolder(tenantSourceNode.GetPublishName("en"), tenant);
                sliderBannersId = mediaNode.GetMediaSliderFolder(mediaId);

                // My Account
                myAccountId     = nodeHelper.GetNodeId(newTenant.Id, "totalCodeAccountPage", "My Account");
                editMyAccountId = nodeHelper.GetNodeId(myAccountId, _09_EditAccountDocumentType.DOCUMENT_TYPE_ALIAS, _09_EditAccountDocumentType.PAGE_NAME);

                documentsId            = nodeHelper.GetNodeId(myAccountId, "totalCodeDocumentPage", "Documents");
                marketingPreferencesId = nodeHelper.GetNodeId(myAccountId, "totalCodeMarketingPage", "Marketing Preferences");

                // Withdraw
                withdrawId = nodeHelper.GetNodeId(newTenant.Id, "totalCodeWithdrawPage", "Withdraw");
                withdrawBankAccountsAndCardsId = nodeHelper.GetNodeId(withdrawId, "totalCodeWithdrawBankPage", "Bank Accounts & Cards");
                withdrawHistoryId = nodeHelper.GetNodeId(withdrawId, "totalCodeWithdrawHistoryPage", "History");

                // Tickets
                ticketsId    = nodeHelper.GetNodeId(newTenant.Id, "totalCodeTicketsPage", "Contact Us");
                viewTicketId = nodeHelper.GetNodeId(ticketsId, "totalCodeTicketPage", "View Ticket");

                // Deposit
                depositId = nodeHelper.GetNodeId(newTenant.Id, "totalCodeDepositPage", "Deposit");
                depositBankAccountsAndCardsId = nodeHelper.GetNodeId(depositId, "totalCodeDepositBankPage", "Bank Accounts & Cards");
                depositHistoryId = nodeHelper.GetNodeId(depositId, "totalCodeDepositHistoryPage", "History");

                // Terms and Conditions
                termsAndConditionsId = nodeHelper.GetNodeId(newTenant.Id, "totalCodeTermsPage", "Terms and Conditions");

                // Settings
                settingsId = nodeHelper.GetNodeId(newTenant.Id, "totalCodeSettingsPage", "Settings");

                // Transaction History
                transactionHistoryId = nodeHelper.GetNodeId(newTenant.Id, "totalCodeTransactionHistoryPage", "Transaction History");

                // Help
                helpId               = nodeHelper.GetNodeId(newTenant.Id, "totalCodeCategoriesPage", "Help");
                loginProblemsId      = nodeHelper.GetNodeId(helpId, "totalCodeCategoryPage", "Login Problems");
                depositAndWithdrawId = nodeHelper.GetNodeId(helpId, "totalCodeCategoryPage ", "Deposit & Withdraw");

                // Sports Pages
                betHistoryId   = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Betting History");
                bonusHistoryId = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Bonus History");
                sportId        = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Sport");
                inPlayId       = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "In-Play");
                casinoId       = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Casino");
                liveCasinoId   = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Live Casino");
                vegasId        = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Vegas");
                lotteryId      = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Lottery");
                pokerId        = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Poker");
                liveScheduleId = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Live Schedule");
                boardId        = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Board Games");
                liveScoreId    = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Live Score");
                overviewId     = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Overview");
                eventViewId    = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Event View");
                resultsId      = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGenericPage", "Results");
                zeppelinId     = nodeHelper.GetNodeId(newTenant.Id, "totalCodeGamePage", "Zeppelin");

                // Affiliate
                affiliateId = nodeHelper.GetNodeId(newTenant.Id, _34_AffiliatePageDocumentType.DOCUMENT_TYPE_ALIAS, "Affiliate");

                // Bonus History Page
                bonusHistoryPageId = nodeHelper.GetNodeId(newTenant.Id, _35_BonusHistoryPageDocumentType.DOCUMENT_TYPE_ALIAS, "Bonus History");

                // Login Page
                loginPageId = nodeHelper.GetNodeId(newTenant.Id, _41_LoginPageDocumentType.DOCUMENT_TYPE_ALIAS, "Login");
            }
            else
            {
                languageService.CreateDictionary(tenant);

                homeId          = homeNode.CreateTenant(tenant);
                mediaId         = mediaNode.CreateMediaHome(tenant);
                sliderBannersId = mediaNode.CreateMediaSliderFolder(mediaId);

                // Create Sub Pages under tenant Root
                var confirmEmailNode = new ConfirmEmailContentNode(ConnectorContext.ContentService, ConnectorContext.ContentTypeService, ConnectorContext.Logger);
                confirmEmailNode.CreateConfirmEmail(tenant);

                var resetPasswordNode = new ResetPasswordContentNode(ConnectorContext.ContentService, ConnectorContext.ContentTypeService, ConnectorContext.Logger);
                resetPasswordNode.CreateResetPasswordPage(tenant);

                // My Account
                myAccountId     = nodeHelper.CreateNode(tenant, homeId, "totalCodeAccountPage", "My Account", "حساب من");
                editMyAccountId = nodeHelper.CreateNode(tenant, myAccountId, "TotalCodeEditAccountPage", "Edit", "ویرایش");

                documentsId            = nodeHelper.CreateNode(tenant, myAccountId, "totalCodeDocumentPage", "Documents", "مدارک شناسایی");
                marketingPreferencesId = nodeHelper.CreateNode(tenant, myAccountId, "totalCodeMarketingPage", "Marketing Preferences", "تنظیمات مارکتینگ");

                // Withdraw
                withdrawId = nodeHelper.CreateNode(tenant, homeId, "totalCodeWithdrawPage", "Withdraw", "برداشت از حساب");
                withdrawBankAccountsAndCardsId = nodeHelper.CreateNode(tenant, withdrawId, "totalCodeWithdrawBankPage", "Bank Accounts & Cards", "کارت و حساب های بانکی");
                withdrawHistoryId = nodeHelper.CreateNode(tenant, withdrawId, "totalCodeWithdrawHistoryPage", "History", "سابقه برداشت از حساب");

                // Tickets
                ticketsId    = nodeHelper.CreateNode(tenant, homeId, "totalCodeTicketsPage", "Contact Us", "پشتیبانی");
                viewTicketId = nodeHelper.CreateNode(tenant, ticketsId, "totalCodeTicketPage", "View Ticket", "نمایش پیام");

                // Deposit
                depositId = nodeHelper.CreateNode(tenant, homeId, "totalCodeDepositPage", "Deposit", "افزایش موجودی");
                depositBankAccountsAndCardsId = nodeHelper.CreateNode(tenant, depositId, "totalCodeDepositBankPage", "Bank Accounts & Cards", "کارت و حساب های بانکی");
                depositHistoryId = nodeHelper.CreateNode(tenant, depositId, "totalCodeDepositHistoryPage", "History", "سابقه افزایش موجودی");

                // Terms and Conditions
                termsAndConditionsId = nodeHelper.CreateNode(tenant, homeId, "totalCodeTermsPage", "Terms and Conditions", "شرایط و ضوابط");

                // Settings
                settingsId = nodeHelper.CreateNode(tenant, homeId, "totalCodeSettingsPage", "Settings", "تنظیمات");

                // Transaction History
                transactionHistoryId = nodeHelper.CreateNode(tenant, homeId, "totalCodeTransactionHistoryPage", "Transaction History", "سابقه تراکنش ها");

                // Help
                helpId = nodeHelper.CreateNode(tenant, homeId, "totalCodeCategoriesPage", "Help", "راهنما");

                // Help categories
                H_registrationAndLoginId = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "Registration and login", "ثبت نام و ورود به سایت");
                H_depositId            = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "Deposit", "افزایش موجودی");
                H_withdrawId           = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "Withdraw", "برداشت از حساب");
                H_myAccountId          = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "My Account", "حساب من");
                H_betHistoryId         = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "Bet History", "سابقه پیش بینی ورزشی");
                H_transactionHistoryId = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "Transaction History", "سابقه تراکنش ها");
                H_sportsId             = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "Sports", "پیش بینی ورزشی");
                H_inplayId             = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "In-Play", "پیش بینی ورزشی زنده");
                H_casinoId             = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "Casino", "کازینو");
                H_liveCasinoId         = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "Live Casino", "کازینو زنده");
                H_pokerId = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "Poker", "پوکر");
                H_faqId   = nodeHelper.CreateNode(tenant, helpId, "totalCodeCategoryPage", "FAQ", "سوالات متداول");

                // Help articles
                HA_registration   = nodeHelper.CreateNode(tenant, H_registrationAndLoginId, "totalCodeArticlePage", "Registration", "ثبت نام");
                HA_login          = nodeHelper.CreateNode(tenant, H_registrationAndLoginId, "totalCodeArticlePage", "Login", "ورود به سایت");
                HA_forgotUsername = nodeHelper.CreateNode(tenant, H_registrationAndLoginId, "totalCodeArticlePage", "Forgot your username?", "فراموش کردن نام کاربری");
                HA_forgotPwd      = nodeHelper.CreateNode(tenant, H_registrationAndLoginId, "totalCodeArticlePage", "Forgot your password?", "فراموش کردن رمز");

                HA_depositCardsAndBank = nodeHelper.CreateNode(tenant, H_depositId, "totalCodeArticlePage", "Cards and Bank Accounts", "کارت و حسابهای بانکی");
                HA_depositCartipay     = nodeHelper.CreateNode(tenant, H_depositId, "totalCodeArticlePage", "Deposit with Cartipay", "افزایش موجودی با کارتی پی");
                HA_depositCartipal     = nodeHelper.CreateNode(tenant, H_depositId, "totalCodeArticlePage", "Deposit with Cartipal", "افزایش موجودی با کارتی پال");
                HA_depositHistory      = nodeHelper.CreateNode(tenant, H_depositId, "totalCodeArticlePage", "Deposit History", "سابقه افزایش موجودی");

                HA_withdrawCardsAndBank = nodeHelper.CreateNode(tenant, H_withdrawId, "totalCodeArticlePage", "Cards and Bank Accounts", "کارت و حساب های بانکی");
                HA_withdraw             = nodeHelper.CreateNode(tenant, H_withdrawId, "totalCodeArticlePage", "Withdraw", "برداشت از حساب");
                HA_withdrawHistory      = nodeHelper.CreateNode(tenant, H_withdrawId, "totalCodeArticlePage", "Withdraw History", "سابقه برداشت از حساب");

                HA_myAccount          = nodeHelper.CreateNode(tenant, H_myAccountId, "totalCodeArticlePage", "My account", "حساب من");
                HA_betHistory         = nodeHelper.CreateNode(tenant, H_betHistoryId, "totalCodeArticlePage", "Bet History", "سابقه پیش بینی ورزشی");
                HA_transactionHistory = nodeHelper.CreateNode(tenant, H_transactionHistoryId, "totalCodeArticlePage", "Transaction History", "سابقه تراکنش ها");
                HA_sportbook          = nodeHelper.CreateNode(tenant, H_sportsId, "totalCodeArticlePage", "Sportbook", "پیش بینی ورزشی");
                HA_inplay             = nodeHelper.CreateNode(tenant, H_inplayId, "totalCodeArticlePage", "In-Play", "پیش بینی زنده");


                // Sports Pages
                betHistoryId   = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Betting History", "سابقه پیش بینی ها");
                bonusHistoryId = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Bonus History", "سابقه بونوس");
                sportId        = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Sport", "پیش بینی ورزشی");
                inPlayId       = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "In-Play", "پیش بینی زنده");
                casinoId       = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Casino", "کازینو");
                liveCasinoId   = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Live Casino", "کازینو زنده");
                vegasId        = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Vegas", "وگاس");
                lotteryId      = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "TVBET", "بخت آزمایی");
                pokerId        = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Poker", "پوکر");
                liveScheduleId = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Live Schedule", "تقویم مسابقات");
                boardId        = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Board Games", "تخته نرد");
                liveScoreId    = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Live Score", "نتایج زنده");
                overviewId     = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Overview", "خلاصه");
                eventViewId    = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Event View", "نمایش رویداد");
                resultsId      = nodeHelper.CreateNode(tenant, homeId, "totalCodeGenericPage", "Results", "نتایج");
                zeppelinId     = nodeHelper.CreateNode(tenant, casinoId, "totalCodeGamePage", "Zeppelin", "انفجار");

                // Affiliate
                affiliateId = nodeHelper.CreateNode(tenant, homeId, _34_AffiliatePageDocumentType.DOCUMENT_TYPE_ALIAS, "Affiliate", "وابسته");

                // Bonus History Page
                bonusHistoryPageId = nodeHelper.CreateNode(tenant, homeId, _35_BonusHistoryPageDocumentType.DOCUMENT_TYPE_ALIAS, "Bonus History", "تاریخ پاداش");

                // Login Page
                loginPageId = nodeHelper.CreateNode(tenant, homeId, _41_LoginPageDocumentType.DOCUMENT_TYPE_ALIAS, "Login", "وارد شدن");

                UpdateTenantPages(betHistoryId, sportId, casinoId, pokerId, inPlayId, liveCasinoId, vegasId, lotteryId, liveScheduleId, boardId, zeppelinId);
            }

            SetHomeMenu(homeId, betHistoryId, sportId, casinoId, pokerId, inPlayId, liveCasinoId, vegasId, lotteryId, liveScheduleId, boardId, overviewId, eventViewId, ticketsId, liveScoreId, resultsId, helpId, depositId, withdrawId, myAccountId, bonusHistoryId, transactionHistoryId);

            SetHomeSettings(tenant, homeId, betHistoryId, sportId, casinoId, pokerId, inPlayId, liveCasinoId, vegasId, lotteryId, liveScheduleId, boardId, overviewId, eventViewId, ticketsId, liveScoreId, resultsId, helpId, depositId, withdrawId, myAccountId, bonusHistoryId, transactionHistoryId, termsAndConditionsId);


            var extended = new ExtendedTenant
            {
                Tenant                = tenant,
                StartContentId        = homeId,
                StartMediaId          = mediaId,
                AllowedSectionAliases = new List <string>
                {
                    DefaultSections.CONTENT, DefaultSections.MEDIA
                },
                Permissions = ExtendedTenant.DefaultManagerPermissions,
            };

            //userGroupService.CreateUserGroup(extended);
            userGroupService.CreateUser(extended);

            // Save Api Key information
            apiService.Save(extended);
            ApiKeyCache.ForceUpdateCache(database);

            if (SaveAndPublish)
            {
                nodeHelper.TryPublishSite(homeId);
            }

            languageService.SetCulturesAndHostnames(extended, setupLocal: SetupLocalUrls, secureUrl: SecureUrls);

            return(extended);
        }
        public ExtendedTenant EditTenant(TenantData tenant, TenantUser user = null, TenantGroup group = null)
        {
            var mediaService = new HomeMediaNode(ConnectorContext.MediaService, ConnectorContext.Logger, ConnectorContext.ContentTypeBaseService);
            var tenantNode   = nodeHelper.GetTenantRoot(tenant.TenantUId);

            languageService.CreateDictionary(tenant);

            if (user != null)
            {
                userGroupService.UpdateUser(user);
            }

            IUserGroup g = null;

            if (group != null)
            {
                if (!string.IsNullOrWhiteSpace(group.RenameGroupTo))
                {
                    g = userGroupService.EditGroup(group.Name, group);
                }
            }
            else
            {
                if (!string.IsNullOrEmpty(tenant.ReadOnlyGroupAlias))
                {
                    g = userGroupService.GetUserGroup(tenant.ReadOnlyGroupAlias);
                }
            }

            var mediaId = mediaService.RenameMediaHome(tenant, user);

            tenant.TenantPreferences.PaymentSettings = tenant.PaymentSettings; //little hack to match total coding system submission to umbraco properties
            tenant.PaymentSettings = null;

            var extended = new ExtendedTenant
            {
                Tenant                = tenant,
                StartContentId        = tenantNode.Id,
                StartMediaId          = mediaId,
                AllowedSectionAliases = g?.AllowedSections,
                Permissions           = g?.Permissions,
            };

            homeNode.EditTenant(tenant);
            nodeHelper.AddLanguageVersionToNode(extended.Tenant);

            extended.Tenant.Username = user?.Username;
            extended.Tenant.Name     = user?.Name;
            extended.Tenant.Email    = user?.Email;
            extended.Tenant.Password = user != null ? "*********" : null;
            extended.Tenant.Group    = group?.Name;
            extended.UserId          = user?.AssignedUmbracoUserId ?? 0;

            if (!string.IsNullOrEmpty(extended.Tenant.AppId) || !string.IsNullOrEmpty(extended.Tenant.ApiKey))
            {
                var apiService = new ApiKeysService(this.database);
                apiService.UpdateApiForTenant(extended);
            }

            if (SaveAndPublish)
            {
                new NodeHelper().TryPublishSite(tenantNode.Id);
            }

            return(extended);
        }