import { Module, Global } from '@nestjs/common';
import { PrismaService } from './persistence/prisma/prisma.service';
import {
  WalletAccountRepositoryImpl,
  LedgerEntryRepositoryImpl,
  DepositOrderRepositoryImpl,
  SettlementOrderRepositoryImpl,
  WithdrawalOrderRepositoryImpl,
  FiatWithdrawalOrderRepositoryImpl,
  PendingRewardRepositoryImpl,
  FeeConfigRepositoryImpl,
} from './persistence/repositories';
import { UnitOfWorkService, UNIT_OF_WORK } from './persistence/unit-of-work';
import {
  WALLET_ACCOUNT_REPOSITORY,
  LEDGER_ENTRY_REPOSITORY,
  DEPOSIT_ORDER_REPOSITORY,
  SETTLEMENT_ORDER_REPOSITORY,
  WITHDRAWAL_ORDER_REPOSITORY,
  FIAT_WITHDRAWAL_ORDER_REPOSITORY,
  PENDING_REWARD_REPOSITORY,
} from '@/domain/repositories';
import { RedisModule } from './redis';
import { KafkaModule } from './kafka';
import { IdentityModule } from './external/identity';

const repositories = [
  {
    provide: WALLET_ACCOUNT_REPOSITORY,
    useClass: WalletAccountRepositoryImpl,
  },
  {
    provide: LEDGER_ENTRY_REPOSITORY,
    useClass: LedgerEntryRepositoryImpl,
  },
  {
    provide: DEPOSIT_ORDER_REPOSITORY,
    useClass: DepositOrderRepositoryImpl,
  },
  {
    provide: SETTLEMENT_ORDER_REPOSITORY,
    useClass: SettlementOrderRepositoryImpl,
  },
  {
    provide: WITHDRAWAL_ORDER_REPOSITORY,
    useClass: WithdrawalOrderRepositoryImpl,
  },
  {
    provide: FIAT_WITHDRAWAL_ORDER_REPOSITORY,
    useClass: FiatWithdrawalOrderRepositoryImpl,
  },
  {
    provide: PENDING_REWARD_REPOSITORY,
    useClass: PendingRewardRepositoryImpl,
  },
  FeeConfigRepositoryImpl,
];

const unitOfWork = {
  provide: UNIT_OF_WORK,
  useClass: UnitOfWorkService,
};

@Global()
@Module({
  imports: [RedisModule, KafkaModule, IdentityModule],
  providers: [PrismaService, unitOfWork, ...repositories],
  exports: [PrismaService, unitOfWork, RedisModule, KafkaModule, IdentityModule, FeeConfigRepositoryImpl, ...repositories],
})
export class InfrastructureModule {}
