import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';
import { InfrastructureModule } from '../infrastructure/infrastructure.module';

// Pre-planting Prisma (独立 schema)
import { PrePlantingPrismaModule } from './infrastructure/prisma/pre-planting-prisma.module';

// CDC Consumer (独立 Kafka consumer group)
import { PrePlantingCdcConsumerService } from './infrastructure/kafka/pre-planting-cdc-consumer.service';

// CDC Event Handlers
import { PrePlantingOrderSyncedHandler } from './application/handlers/pre-planting-order-synced.handler';
import { PrePlantingPositionSyncedHandler } from './application/handlers/pre-planting-position-synced.handler';
import { PrePlantingMergeSyncedHandler } from './application/handlers/pre-planting-merge-synced.handler';
import { PrePlantingCdcDispatcher } from './application/handlers/pre-planting-cdc-dispatcher';

// Application Services
import { PrePlantingContributionService } from './application/services/pre-planting-contribution.service';

// Schedulers
import { PrePlantingFreezeScheduler } from './application/schedulers/pre-planting-freeze.scheduler';
import { PrePlantingContributionScheduler } from './application/schedulers/pre-planting-contribution.scheduler';

// 现有 Application Services（直接提供，不 import ApplicationModule 避免引入现有 CDCEventDispatcher）
// 这些服务是无状态的，仅依赖 InfrastructureModule 的 providers，重复实例化无副作用。
import { ContributionRateService } from '../application/services/contribution-rate.service';
import { ContributionDistributionPublisherService } from '../application/services/contribution-distribution-publisher.service';
import { BonusClaimService } from '../application/services/bonus-claim.service';

/**
 * 预种 CDC 集成模块
 *
 * [2026-02-17] 新增：将预种数据集成到 contribution-service 2.0 算力体系
 *
 * === 功能概述 ===
 * 1. 通过独立 CDC consumer 消费预种表变更（cdc.pre-planting.public.*）
 * 2. 同步预种订单/持仓到独立追踪表（PrePlantingPrismaService）
 * 3. 为每份预种订单计算 1/10 算力（复用现有领域计算器，10份合1棵树）
 * 4. 在 synced_adoptions 中插入 marker 记录（让现有 unlock 逻辑自然计入预种用户）
 * 5. 每日检查冻结/解冻条件（1 年未满 10 份 → 冻结；满 10 份 → 解冻 + 2 年有效期）
 *
 * === 隔离保证 ===
 * - 独立 Kafka consumer group：contribution-pre-planting-cdc（不影响现有 contribution-service-cdc-group）
 * - 独立 CDC topics：cdc.pre-planting.public.*（不影响现有 cdc.planting.public.* topics）
 * - 独立 Debezium connector / replication slot / publication
 * - 独立 Prisma schema：prisma/pre-planting/schema.prisma（追踪表与现有表完全分离）
 * - 幂等性共用主 PrismaService 的 ProcessedCdcEvent 表（同 DB 事务保证一致性）
 *
 * === 对现有系统的影响 ===
 * - 零修改现有代码文件。本模块是纯新增。
 * - 算力写入现有 contribution_accounts / contribution_records 表（挖矿系统可见）
 * - sourceAdoptionId 使用 10,000,000,000 偏移，永远不会与正常认种 ID 冲突
 * - synced_adoptions 中的 marker 记录设置 contributionDistributed=true + treeCount=0，
 *   现有调度器不会处理，即使误处理也不会产生算力
 * - 不更新 NetworkAdoptionProgress（预种份额不推高全网算力系数）
 *
 * === 依赖关系 ===
 * - InfrastructureModule：提供 PrismaService、Repositories、UnitOfWork、Redis 等
 * - PrePlantingPrismaModule：提供独立的 PrePlantingPrismaService
 * - ScheduleModule：提供 @Cron 装饰器支持（冻结调度器）
 */
@Module({
  imports: [
    ScheduleModule.forRoot(),
    InfrastructureModule,
    PrePlantingPrismaModule,
  ],
  providers: [
    // CDC Consumer (独立 consumer group)
    PrePlantingCdcConsumerService,

    // CDC Event Handlers
    PrePlantingOrderSyncedHandler,
    PrePlantingPositionSyncedHandler,
    PrePlantingMergeSyncedHandler,
    PrePlantingCdcDispatcher,

    // Application Services (预种)
    PrePlantingContributionService,

    // Application Services (现有，直接提供以避免 import ApplicationModule)
    // ApplicationModule 内含 CDCEventDispatcher，import 会导致现有 CDC 被二次注册
    ContributionRateService,
    ContributionDistributionPublisherService,
    BonusClaimService,

    // Schedulers
    PrePlantingFreezeScheduler,
    PrePlantingContributionScheduler,
  ],
})
export class PrePlantingCdcModule {}
