import { Module, forwardRef } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AuthModule } from '../../auth/auth.module';
import { PaymentSettlementController } from './payment-settlement.controller';
import { PaymentSettlementService } from './payment-settlement.service';
import { PaymentSettlementRepository } from './repositories/payment-settlement.repository';
import { SettlementPaymentRepository } from './repositories/settlement-payment.repository';
import { BookingSettlementMasterRepository } from './repositories/booking-settlement-master.repository';
import { SettlementAnalyticsRepository } from './repositories/settlement-analytics.repository';
import { PaymentSettlementEntity } from '../../entities/payment-settlement.entity';
import { SettlementPaymentEntity } from '../../entities/settlement-payment.entity';
import { BookingSettlementMasterEntity } from '../../entities/booking-settlement-master.entity';
import { BookingEntity } from '../../entities/booking.entity';
import { QueryEntity } from '../../entities/query.entity';
import { TaxTypeModule } from '../tax-type/tax-type.module';
import { PaymentCollectionEntity } from '../../entities/payment-collection.entity';
import { PaymentCollectionRepository } from './repositories/payment-collection.repository';
import { CustomerCreditLedgerEntity } from '../../entities/customer-credit-ledger.entity';
import { CustomerCreditLedgerMovementEntity } from '../../entities/customer-credit-ledger-movement.entity';
import { CustomerCreditLedgerRepository } from './repositories/customer-credit-ledger.repository';
import { SupplierPayoutEntity } from '../../entities/supplier-payout.entity';
import { SupplierPayoutRepository } from './repositories/supplier-payout.repository';
import { ServicePaymentCollectionModule } from '../service-payment-collection/service-payment-collection.module';
import { BankAccountModule } from '../bank-account/bank-account.module';

/**
 * §12 Payment Settlement Management.
 *
 * Phase A — entity + repo + skeleton service wired. Controller comes
 * in Phase D. The service is exported so BookingService and
 * BookingItineraryService can call `recordFromBooking` /
 * `recordItineraryDelta` from their save paths (Phase B).
 */
@Module({
  imports: [
    TypeOrmModule.forFeature([
      PaymentSettlementEntity,
      SettlementPaymentEntity,
      BookingSettlementMasterEntity,
      PaymentCollectionEntity,
      CustomerCreditLedgerEntity,
      CustomerCreditLedgerMovementEntity,
      SupplierPayoutEntity,
      // Booking + Query lookups feed the per-payment slab resolver —
      // we walk booking → query → destination to pick the right slab.
      BookingEntity,
      QueryEntity,
    ]),
    AuthModule,
    // Brings TaxSlabResolverService into scope for Step 3h.
    TaxTypeModule,
    BankAccountModule,
    forwardRef(() => ServicePaymentCollectionModule),
  ],
  controllers: [PaymentSettlementController],
  providers: [
    PaymentSettlementService,
    PaymentSettlementRepository,
    SettlementPaymentRepository,
    BookingSettlementMasterRepository,
    SettlementAnalyticsRepository,
    PaymentCollectionRepository,
    CustomerCreditLedgerRepository,
    SupplierPayoutRepository,
  ],
  exports: [PaymentSettlementService],
})
export class PaymentSettlementModule {}
