package bootstrap

import (
	"context"

	"go.uber.org/zap"

	agentrechargeApp "github.com/break/junhong_cmp_fiber/internal/application/agentrecharge"
	approvalApp "github.com/break/junhong_cmp_fiber/internal/application/approval"
	cardObservationApp "github.com/break/junhong_cmp_fiber/internal/application/cardobservation"
	exchangeApp "github.com/break/junhong_cmp_fiber/internal/application/exchange"
	refundapprovalApp "github.com/break/junhong_cmp_fiber/internal/application/refundapproval"
	walletapp "github.com/break/junhong_cmp_fiber/internal/application/wallet"
	approvalInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/approval"
	cardObservationInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/cardobservation"
	exchangeInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/exchange"
	"github.com/break/junhong_cmp_fiber/internal/infrastructure/integrationlog"
	"github.com/break/junhong_cmp_fiber/internal/infrastructure/messaging/outbox"
	walletinfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/wallet"
	wecomInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/wecom"
	"github.com/break/junhong_cmp_fiber/internal/polling"
	accountSvc "github.com/break/junhong_cmp_fiber/internal/service/account"
	accountAuditSvc "github.com/break/junhong_cmp_fiber/internal/service/account_audit"
	agentOpenAPISvc "github.com/break/junhong_cmp_fiber/internal/service/agent_open_api"
	assetAllocationRecordSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_allocation_record"
	assetAuditSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_audit"
	authSvc "github.com/break/junhong_cmp_fiber/internal/service/auth"
	carrierSvc "github.com/break/junhong_cmp_fiber/internal/service/carrier"
	clientAuthSvc "github.com/break/junhong_cmp_fiber/internal/service/client_auth"
	commissionCalculationSvc "github.com/break/junhong_cmp_fiber/internal/service/commission_calculation"
	commissionStatsSvc "github.com/break/junhong_cmp_fiber/internal/service/commission_stats"
	commissionWithdrawalSvc "github.com/break/junhong_cmp_fiber/internal/service/commission_withdrawal"
	commissionWithdrawalSettingSvc "github.com/break/junhong_cmp_fiber/internal/service/commission_withdrawal_setting"
	customerBindingSvc "github.com/break/junhong_cmp_fiber/internal/service/customer_binding"
	"github.com/break/junhong_cmp_fiber/internal/store/postgres"
	"github.com/break/junhong_cmp_fiber/pkg/config"
	"github.com/break/junhong_cmp_fiber/pkg/constants"
	"github.com/break/junhong_cmp_fiber/pkg/payment"
	"github.com/break/junhong_cmp_fiber/pkg/queue"

	assetSvc "github.com/break/junhong_cmp_fiber/internal/service/asset"
	assetPackageBatchOrderSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_package_batch_order"
	assetWalletSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_wallet"
	deviceSvc "github.com/break/junhong_cmp_fiber/internal/service/device"
	deviceImportSvc "github.com/break/junhong_cmp_fiber/internal/service/device_import"
	enterpriseSvc "github.com/break/junhong_cmp_fiber/internal/service/enterprise"
	enterpriseCardSvc "github.com/break/junhong_cmp_fiber/internal/service/enterprise_card"
	enterpriseDeviceSvc "github.com/break/junhong_cmp_fiber/internal/service/enterprise_device"
	exchangeSvc "github.com/break/junhong_cmp_fiber/internal/service/exchange"
	exportTaskSvc "github.com/break/junhong_cmp_fiber/internal/service/export_task"
	iotCardSvc "github.com/break/junhong_cmp_fiber/internal/service/iot_card"
	iotCardImportSvc "github.com/break/junhong_cmp_fiber/internal/service/iot_card_import"
	orderSvc "github.com/break/junhong_cmp_fiber/internal/service/order"
	packageSvc "github.com/break/junhong_cmp_fiber/internal/service/package"
	packageSeriesSvc "github.com/break/junhong_cmp_fiber/internal/service/package_series"
	permissionSvc "github.com/break/junhong_cmp_fiber/internal/service/permission"
	personalCustomerSvc "github.com/break/junhong_cmp_fiber/internal/service/personal_customer"
	purchaseValidationSvc "github.com/break/junhong_cmp_fiber/internal/service/purchase_validation"
	rechargeSvc "github.com/break/junhong_cmp_fiber/internal/service/recharge"
	roleSvc "github.com/break/junhong_cmp_fiber/internal/service/role"
	shopSvc "github.com/break/junhong_cmp_fiber/internal/service/shop"

	agentRechargeSvc "github.com/break/junhong_cmp_fiber/internal/service/agent_recharge"
	operationPasswordSvc "github.com/break/junhong_cmp_fiber/internal/service/operation_password"
	orderPackageInvalidateSvc "github.com/break/junhong_cmp_fiber/internal/service/order_package_invalidate"
	pollingSvc "github.com/break/junhong_cmp_fiber/internal/service/polling"
	refundSvc "github.com/break/junhong_cmp_fiber/internal/service/refund"
	shopCommissionSvc "github.com/break/junhong_cmp_fiber/internal/service/shop_commission"
	shopPackageBatchAllocationSvc "github.com/break/junhong_cmp_fiber/internal/service/shop_package_batch_allocation"
	shopPackageBatchPricingSvc "github.com/break/junhong_cmp_fiber/internal/service/shop_package_batch_pricing"
	shopSeriesGrantSvc "github.com/break/junhong_cmp_fiber/internal/service/shop_series_grant"
	trafficSvc "github.com/break/junhong_cmp_fiber/internal/service/traffic"
	wechatConfigSvc "github.com/break/junhong_cmp_fiber/internal/service/wechat_config"
)

type services struct {
	Approval                    *approvalApp.CreationService
	Account                     *accountSvc.Service
	AccountAudit                *accountAuditSvc.Service
	AssetAudit                  *assetAuditSvc.Service
	Role                        *roleSvc.Service
	Permission                  *permissionSvc.Service
	PersonalCustomer            *personalCustomerSvc.Service
	ClientAuth                  *clientAuthSvc.Service
	Shop                        *shopSvc.Service
	Auth                        *authSvc.Service
	ShopCommission              *shopCommissionSvc.Service
	CommissionWithdrawal        *commissionWithdrawalSvc.Service
	CommissionWithdrawalSetting *commissionWithdrawalSettingSvc.Service
	CommissionCalculation       *commissionCalculationSvc.Service
	Enterprise                  *enterpriseSvc.Service
	EnterpriseCard              *enterpriseCardSvc.Service
	EnterpriseDevice            *enterpriseDeviceSvc.Service
	Authorization               *enterpriseCardSvc.AuthorizationService
	IotCard                     *iotCardSvc.Service
	IotCardImport               *iotCardImportSvc.Service
	ExportTask                  *exportTaskSvc.Service
	Device                      *deviceSvc.Service
	DeviceImport                *deviceImportSvc.Service
	AssetAllocationRecord       *assetAllocationRecordSvc.Service
	Carrier                     *carrierSvc.Service
	PackageSeries               *packageSeriesSvc.Service
	Package                     *packageSvc.Service
	PackageDailyRecord          *packageSvc.DailyRecordService
	PackageCustomerView         *packageSvc.CustomerViewService
	ShopPackageBatchAllocation  *shopPackageBatchAllocationSvc.Service
	ShopPackageBatchPricing     *shopPackageBatchPricingSvc.Service
	ShopSeriesGrant             *shopSeriesGrantSvc.Service
	CommissionStats             *commissionStatsSvc.Service
	PurchaseValidation          *purchaseValidationSvc.Service
	Order                       *orderSvc.Service
	Exchange                    *exchangeSvc.Service
	Recharge                    *rechargeSvc.Service
	PollingConfig               *pollingSvc.ConfigService
	PollingConcurrency          *pollingSvc.ConcurrencyService
	PollingMonitoring           *pollingSvc.MonitoringService
	PollingAlert                *pollingSvc.AlertService
	PollingCleanup              *pollingSvc.CleanupService
	PollingManualTrigger        *pollingSvc.ManualTriggerService
	Asset                       *assetSvc.Service
	AssetLifecycle              *assetSvc.LifecycleService
	AssetWallet                 *assetWalletSvc.Service
	StopResumeService           *iotCardSvc.StopResumeService
	WechatConfig                *wechatConfigSvc.Service
	AgentRecharge               *agentRechargeSvc.Service
	PackageActivation           *packageSvc.ActivationService
	Refund                      *refundSvc.Service
	TrafficQuery                *trafficSvc.QueryService
	OperationPassword           *operationPasswordSvc.Service
	AgentOpenAPI                *agentOpenAPISvc.Service
	CustomerBinding             *customerBindingSvc.Service
	OrderPackageInvalidate      *orderPackageInvalidateSvc.Service
	AssetPackageBatchOrder      *assetPackageBatchOrderSvc.Service
	ObservationSeries           cardObservationApp.BestEffortSeriesDispatcher
	CardObservation             *cardObservationApp.Service
	CardObservationSeries       *cardObservationApp.SeriesAttemptService
}

func initServices(s *stores, deps *Dependencies) *services {
	// CustomerBinding 模块依赖最少，最先初始化
	customerBinding := customerBindingSvc.New(deps.DB, s.IotCard, s.Device)

	purchaseValidation := purchaseValidationSvc.New(deps.DB, s.IotCard, s.Device, s.Package, s.ShopPackageAllocation)
	accountAudit := accountAuditSvc.NewService(s.AccountOperationLog)
	assetAudit := assetAuditSvc.NewService(s.AssetOperationLog, deps.DB)
	account := accountSvc.New(s.Account, s.Role, s.AccountRole, s.ShopRole, s.Shop, s.Enterprise, accountAudit)

	// 创建 IotCard service 并设置回调
	iotCard := iotCardSvc.New(
		deps.DB,
		s.IotCard,
		s.Shop,
		s.AssetAllocationRecord,
		s.ShopPackageAllocation,
		s.ShopSeriesAllocation,
		s.PackageSeries,
		deps.GatewayClient,
		deps.Logger,
		assetAudit,
	)
	cardObservationOutbox := outbox.NewRepository()
	observationSeriesEvents := cardObservationInfra.NewSeriesEventWriter(cardObservationOutbox)
	cardObservationService := cardObservationApp.NewService(
		deps.DB,
		cardObservationInfra.NewEventWriter(cardObservationOutbox),
		cardObservationInfra.NewCacheInvalidator(deps.Redis, deps.Logger),
	)
	iotCard.SetCardObservationService(cardObservationService)
	iotCard.SetSpeedTierIntegrationLog(integrationlog.NewRepository(deps.DB))
	seriesCoordinator := cardObservationInfra.NewSeriesCoordinator(deps.Redis)
	seriesIntegration := integrationlog.NewRepository(deps.DB)
	seriesTrigger := cardObservationApp.NewSeriesTrigger(
		seriesCoordinator,
		queue.NewCardObservationSeriesScheduler(deps.QueueClient),
		cardObservationInfra.NewSeriesAttemptLogger(seriesIntegration),
	)
	cardObservationSeries := cardObservationApp.NewSeriesAttemptService(
		seriesCoordinator,
		cardObservationInfra.NewSeriesRunner(deps.DB, deps.GatewayClient, cardObservationService, seriesIntegration),
		cardObservationInfra.NewSeriesAttemptLogger(seriesIntegration),
	)
	observationSeries := cardObservationInfra.NewBestEffortSeriesDispatcher(seriesTrigger, deps.Logger, s.DeviceSimBinding, s.Carrier)
	iotCard.SetObservationSeriesDispatcher(observationSeries)
	// 使用 PollingLifecycleService 替代 APICallback：通过分片队列准确操作（修复 api_callback.go 遗漏 protect 队列的 Bug3）
	pollingConfigStore := postgres.NewPollingConfigStore(deps.DB)
	pollingConfigMgr := polling.NewPollingConfigManager(pollingConfigStore, deps.Redis, deps.Logger)
	if err := pollingConfigMgr.Load(context.Background()); err != nil {
		deps.Logger.Warn("API 进程加载轮询配置失败", zap.Error(err))
	}
	pollingConfigMgr.Start(context.Background())
	pollingQueueMgr := polling.NewPollingQueueManager(deps.Redis, constants.PollingShardCount, deps.Logger)
	pollingLifecycleSvc := polling.NewPollingLifecycleService(pollingQueueMgr, pollingConfigMgr, s.IotCard, s.DeviceSimBinding, s.Device, deps.Logger)
	iotCard.SetPollingCallback(pollingLifecycleSvc)
	// 创建支付配置服务（Order 和 Recharge 依赖）
	wechatConfig := wechatConfigSvc.New(s.WechatConfig, s.Order, s.RechargeOrder, s.AgentRecharge, s.Payment, accountAudit, deps.Redis, deps.Logger)

	// 创建支付配置动态加载器（Order 和 Recharge 依赖）
	paymentLoader := payment.NewPaymentConfigLoader(s.WechatConfig, deps.Redis, deps.Logger)

	packageActivation := packageSvc.NewActivationService(
		deps.DB,
		deps.Redis,
		s.PackageUsage,
		s.Package,
		s.PackageUsageDailyRecord,
		deps.Logger,
	)
	packageActivation.SetObservationSeriesEventWriter(observationSeriesEvents)

	stopResumeService := iotCardSvc.NewStopResumeService(
		deps.Redis,
		s.IotCard,
		s.PackageUsage,
		s.DeviceSimBinding,
		deps.GatewayClient,
		deps.Logger,
		assetAudit,
	)
	stopResumeService.SetPollingCallback(pollingLifecycleSvc)
	stopResumeService.SetObservationSeriesEventWriter(deps.DB, observationSeriesEvents)
	iotCard.SetRealnameActivator(packageActivation)
	iotCard.SetStopResumeService(stopResumeService)
	iotCard.SetDeviceSimBindingStore(s.DeviceSimBinding)
	iotCard.SetEnterpriseCardAuthStore(s.EnterpriseCardAuthorization)
	iotCard.SetEnterpriseStore(s.Enterprise)
	iotCard.SetRedisClient(deps.Redis)
	device := deviceSvc.New(
		deps.DB,
		deps.Redis,
		s.Device,
		s.DeviceSimBinding,
		s.IotCard,
		s.Shop,
		s.AssetAllocationRecord,
		s.ShopPackageAllocation,
		s.ShopSeriesAllocation,
		s.PackageSeries,
		deps.GatewayClient,
		s.AssetIdentifier,
		assetAudit,
		s.EnterpriseDeviceAuthorization,
		s.Enterprise,
	)
	device.SetObservationSeriesEventWriter(observationSeriesEvents)
	device.SetObservationSeriesDispatcher(observationSeries)
	operationPassword := operationPasswordSvc.New(deps.Redis)
	shopCommission := shopCommissionSvc.New(s.Shop, s.Account, s.AgentWallet, s.CommissionWithdrawalRequest, s.CommissionWithdrawalSetting, s.CommissionRecord, s.AgentWalletTransaction, deps.DB, deps.Logger)
	packageService := packageSvc.New(s.Package, s.PackageSeries, s.ShopPackageAllocation, s.ShopSeriesAllocation)
	orderService := orderSvc.New(deps.DB, deps.Redis, s.Order, s.OrderItem, s.AgentWallet, s.AssetWallet, s.Payment, purchaseValidation, s.ShopPackageAllocation, s.ShopSeriesAllocation, s.IotCard, s.Device, s.PackageSeries, s.PackageUsage, s.Package, wechatConfig, deps.WechatPayment, paymentLoader, deps.QueueClient, deps.Logger, s.AssetIdentifier, s.PersonalCustomer, s.PersonalCustomerPhone)
	orderService.SetObservationSeriesEventWriter(observationSeriesEvents)
	walletOutbox := outbox.NewRepository()
	walletDebitEvents := walletinfra.NewDebitEventWriter(walletOutbox)
	orderService.SetAgentWalletDebitService(walletapp.NewDebitService(walletDebitEvents, nil))
	orderService.SetAgentWalletReservationService(walletapp.NewReservationService(walletinfra.NewReservationEventWriter(walletOutbox), walletDebitEvents, nil))
	agentRechargeService := agentRechargeSvc.New(
		deps.DB,
		s.AgentRecharge,
		s.AgentWallet,
		s.Shop,
		wechatConfig,
		accountAudit,
		operationPassword,
		deps.Redis,
		deps.Logger,
	)
	agentWalletPosting := walletapp.NewPostingService(walletinfra.NewCreditEventWriter(walletOutbox), nil)
	agentRechargeService.SetAgentWalletPostingService(agentWalletPosting)
	refundService := refundSvc.New(
		deps.DB,
		s.RefundRequest,
		s.Order,
		s.CommissionRecord,
		s.AgentWallet,
		s.AgentWalletTransaction,
		stopResumeService,
		device,
		packageActivation,
		s.IotCard,
		s.Device,
		s.AssetWallet,
		deps.Logger,
	)
	refundService.SetAgentWalletRefundService(walletapp.NewRefundService(walletinfra.NewRefundEventWriter(walletOutbox), nil))
	exchangeService := exchangeSvc.New(deps.DB, s.ExchangeOrder, s.IotCard, s.Device, s.AssetWallet, s.AssetWalletTransaction, s.PackageUsage, s.PackageUsageDailyRecord, s.ResourceTag, customerBinding, deps.Logger)
	exchangeService.SetShippingCreatedNotifier(exchangeApp.NewShippingCreatedNotifier(exchangeInfra.NewShippingNotificationWriter(outbox.NewRepository())))
	assetService := assetSvc.New(deps.DB, s.Device, s.IotCard, s.PackageUsage, s.Package, s.PackageSeries, s.DeviceSimBinding, s.Shop, deps.Redis, iotCard, deps.GatewayClient, s.AssetIdentifier, s.Order, s.OrderItem, s.ExchangeOrder, assetAudit)
	agentOpenAPI := agentOpenAPISvc.New(assetService, packageService, orderService, shopCommission, stopResumeService, device, s.IotCard, s.PackageUsage, s.Package, s.PackageSeries, s.AgentWallet, s.DeviceSimBinding, s.Device)
	agentOpenAPI.SetObservationSeriesDispatcher(observationSeries)
	wecomApplicationRepository := wecomInfra.NewApplicationRepository(deps.DB)
	wecomSceneRepository := wecomInfra.NewSceneRepository(deps.DB)
	wecomMemberRepository := wecomInfra.NewMemberRepository(deps.DB)
	wecomBaseURL := ""
	wecomTimeout := constants.WeComDefaultHTTPTimeout
	var wecomCredentialCipher *wecomInfra.CredentialCipher
	if cfg := config.Get(); cfg != nil {
		wecomBaseURL = cfg.WeCom.BaseURL
		wecomTimeout = cfg.WeCom.Timeout
		wecomCredentialCipher, _ = wecomInfra.NewCredentialCipher(cfg.WeCom.CredentialEncryptionKey)
	}
	wecomIntegrationRepository := integrationlog.NewRepository(deps.DB)
	wecomTokenProvider := wecomInfra.NewTokenProvider(
		wecomApplicationRepository, wecomCredentialCipher, deps.Redis, wecomIntegrationRepository,
		wecomBaseURL, wecomTimeout, deps.Logger,
	)
	approvalCreationService := approvalApp.NewCreationService(
		wecomInfra.NewApprovalProvider(
			deps.DB, wecomSceneRepository, wecomApplicationRepository, wecomMemberRepository,
			wecomInfra.NewTemplateClient(wecomTokenProvider, wecomIntegrationRepository, wecomBaseURL, wecomTimeout),
		),
		approvalInfra.NewRepositoryProvider(),
		approvalInfra.NewSubmissionEventWriter(outbox.NewRepository()),
		nil,
	)
	agentRechargeService.SetOfflineCreationService(
		agentrechargeApp.NewOfflineCreationService(deps.DB, approvalCreationService),
	)
	refundService.SetRefundApprovalCreationService(
		refundapprovalApp.NewCreationService(deps.DB, approvalCreationService),
	)

	return &services{
		Approval:         approvalCreationService,
		Account:          account,
		AccountAudit:     accountAudit,
		AssetAudit:       assetAudit,
		Role:             roleSvc.New(s.Role, s.Permission, s.RolePermission, s.AccountRole, s.ShopRole),
		Permission:       permissionSvc.New(s.Permission, s.AccountRole, s.RolePermission, account, deps.Redis),
		PersonalCustomer: personalCustomerSvc.NewService(s.PersonalCustomer, s.PersonalCustomerPhone, deps.Logger),
		ClientAuth: clientAuthSvc.New(
			deps.DB,
			s.PersonalCustomerOpenID,
			s.PersonalCustomer,
			s.PersonalCustomerPhone,
			s.IotCard,
			s.Device,
			wechatConfig,
			deps.VerificationService,
			deps.JWTManager,
			deps.Redis,
			deps.Logger,
			customerBinding,
		),
		Shop:                        shopSvc.New(s.Shop, s.Account, s.ShopRole, s.Role),
		Auth:                        authSvc.New(s.Account, s.AccountRole, s.RolePermission, s.Permission, s.Shop, deps.TokenManager, deps.Logger),
		ShopCommission:              shopCommission,
		CommissionWithdrawal:        commissionWithdrawalSvc.New(deps.DB, s.Shop, s.Account, s.AgentWallet, s.AgentWalletTransaction, s.CommissionWithdrawalRequest),
		CommissionWithdrawalSetting: commissionWithdrawalSettingSvc.New(deps.DB, s.Account, s.CommissionWithdrawalSetting),
		CommissionCalculation: commissionCalculationSvc.New(
			deps.DB,
			s.CommissionRecord,
			s.Shop,
			s.ShopPackageAllocation,
			s.ShopSeriesAllocation,
			s.PackageSeries,
			s.IotCard,
			s.Device,
			s.AgentWallet,
			s.AgentWalletTransaction,
			s.Order,
			s.OrderItem,
			s.Package,
			s.ShopSeriesCommissionStats,
			commissionStatsSvc.New(s.ShopSeriesCommissionStats),
			deps.Logger,
		),
		Enterprise:                 enterpriseSvc.New(deps.DB, s.Enterprise, s.Shop, s.Account),
		EnterpriseCard:             enterpriseCardSvc.New(deps.DB, s.Enterprise, s.EnterpriseCardAuthorization, s.IotCard),
		EnterpriseDevice:           enterpriseDeviceSvc.New(deps.DB, s.Enterprise, s.Device, s.DeviceSimBinding, s.EnterpriseDeviceAuthorization, s.EnterpriseCardAuthorization, deps.Logger),
		Authorization:              enterpriseCardSvc.NewAuthorizationService(s.Enterprise, s.IotCard, s.EnterpriseCardAuthorization, deps.Logger),
		IotCard:                    iotCard,
		IotCardImport:              iotCardImportSvc.New(deps.DB, s.IotCardImportTask, deps.QueueClient, assetAudit),
		ExportTask:                 exportTaskSvc.New(deps.DB, s.ExportTask, deps.QueueClient, deps.StorageService),
		Device:                     device,
		DeviceImport:               deviceImportSvc.New(deps.DB, s.DeviceImportTask, deps.QueueClient, assetAudit),
		AssetAllocationRecord:      assetAllocationRecordSvc.New(deps.DB, s.AssetAllocationRecord, s.Shop, s.Account),
		Carrier:                    carrierSvc.New(s.Carrier),
		PackageSeries:              packageSeriesSvc.New(s.PackageSeries, s.ShopSeriesAllocation, s.Package),
		Package:                    packageService,
		PackageDailyRecord:         packageSvc.NewDailyRecordService(deps.DB, deps.Redis, s.PackageUsageDailyRecord, deps.Logger),
		PackageCustomerView:        packageSvc.NewCustomerViewService(deps.DB, deps.Redis, s.PackageUsage, deps.Logger),
		ShopPackageBatchAllocation: shopPackageBatchAllocationSvc.New(deps.DB, s.Package, s.ShopPackageAllocation, s.ShopSeriesAllocation, s.Shop, accountAudit),
		ShopPackageBatchPricing:    shopPackageBatchPricingSvc.New(deps.DB, s.ShopPackageAllocation, s.ShopPackageAllocationPriceHistory, s.Shop),
		ShopSeriesGrant:            shopSeriesGrantSvc.New(deps.DB, s.ShopSeriesAllocation, s.ShopPackageAllocation, s.ShopPackageAllocationPriceHistory, s.Shop, s.Package, s.PackageSeries, deps.Logger),
		CommissionStats:            commissionStatsSvc.New(s.ShopSeriesCommissionStats),
		PurchaseValidation:         purchaseValidation,
		Order:                      orderService,
		Exchange:                   exchangeService,
		Recharge:                   rechargeSvc.New(deps.DB, s.AssetWallet, s.AssetWalletTransaction, s.IotCard, s.Device, s.ShopSeriesAllocation, s.PackageSeries, s.CommissionRecord, wechatConfig, paymentLoader, deps.Logger),
		PollingConfig:              pollingSvc.NewConfigService(s.PollingConfig, deps.Redis, deps.Logger),
		PollingConcurrency:         pollingSvc.NewConcurrencyService(s.PollingConcurrencyConfig, deps.Redis),
		PollingMonitoring:          pollingSvc.NewMonitoringServiceWithQueueMgr(deps.Redis, pollingQueueMgr, deps.Logger),
		PollingAlert:               pollingSvc.NewAlertService(s.PollingAlertRule, s.PollingAlertHistory, deps.Redis, deps.Logger),
		PollingCleanup:             pollingSvc.NewCleanupService(s.DataCleanupConfig, s.DataCleanupLog, deps.Logger),
		PollingManualTrigger:       pollingSvc.NewManualTriggerService(s.PollingManualTriggerLog, s.IotCard, deps.Redis, deps.Logger),
		Asset:                      assetService,
		AssetLifecycle:             assetSvc.NewLifecycleService(deps.DB, s.IotCard, s.Device, assetAudit),
		AssetWallet:                assetWalletSvc.New(s.AssetWallet, s.AssetWalletTransaction),
		StopResumeService:          stopResumeService,
		WechatConfig:               wechatConfig,
		AgentRecharge:              agentRechargeService,
		PackageActivation:          packageActivation,
		TrafficQuery:               trafficSvc.NewQueryService(deps.Redis, s.CardDailyUsage),
		OperationPassword:          operationPassword,
		AgentOpenAPI:               agentOpenAPI,
		Refund:                     refundService,
		CustomerBinding:            customerBinding,
		OrderPackageInvalidate:     orderPackageInvalidateSvc.New(s.OrderPackageInvalidateTask, deps.QueueClient),
		AssetPackageBatchOrder:     assetPackageBatchOrderSvc.New(s.AssetPackageBatchOrderTask, s.Package, deps.QueueClient),
		ObservationSeries:          observationSeries,
		CardObservation:            cardObservationService,
		CardObservationSeries:      cardObservationSeries,
	}
}
