import { Module, forwardRef } from '@nestjs/common';
import { ChangeRequestModule } from '../change-request/change-request.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AuthModule } from '../../auth/auth.module';
import { UserModule } from '../user/user.module';
import { AuditModule } from '../audit/audit.module';
import { DriverModule } from '../driver/driver.module';
import { TaxTypeModule } from '../tax-type/tax-type.module';
import { PaymentSettlementModule } from '../payment-settlement/payment-settlement.module';
import { BookingController } from './booking.controller';
import { BookingService } from './booking.service';
import { QuickBookingService } from './services/quick-booking.service';
import { DriverAssignmentService } from './services/driver-assignment.service';
import { ActivityTicketMailService } from './services/activity-ticket-mail.service';
import { BookingItineraryService } from './services/booking-itinerary.service';
import { MovementChartExportService } from './services/movement-chart-export.service';
import { BookingStatusSyncService } from './services/booking-status-sync.service';
import { BookingPanService } from './services/booking-pan.service';
import { BookingStatusSyncTask } from './tasks/booking-status-sync.task';
import { BookingRepository } from './repositories/booking.repository';
import { BookingEntity } from '../../entities/booking.entity';
import { BookingHotelItemEntity } from '../../entities/booking-hotel-item.entity';
import { BookingHotelPeriodEntity } from '../../entities/booking-hotel-period.entity';
import { BookingHotelExtraEntity } from '../../entities/booking-hotel-extra.entity';
import { BookingTransportItemEntity } from '../../entities/booking-transport-item.entity';
import { BookingActivityItemEntity } from '../../entities/booking-activity-item.entity';
import { BookingSpecialItemEntity } from '../../entities/booking-special-item.entity';
import { BookingFlightDetailEntity } from '../../entities/booking-flight-detail.entity';
import { QueryEntity } from '../../entities/query.entity';
import { QueryQuoteEntity } from '../../entities/query-quote.entity';
import { QueryQuoteHotelEntity } from '../../entities/query-quote-hotel.entity';
import { QueryQuoteHotelPeriodEntity } from '../../entities/query-quote-hotel-period.entity';
import { QueryQuoteHotelExtraEntity } from '../../entities/query-quote-hotel-extra.entity';
import { QueryQuoteTransportEntity } from '../../entities/query-quote-transport.entity';
import { QueryQuoteActivityEntity } from '../../entities/query-quote-activity.entity';
import { ActivityEntity } from '../../entities/activity.entity';
import { QueryQuoteSpecialEntity } from '../../entities/query-quote-special.entity';
import { ActivityTicketItemEntity } from '../../entities/activity-ticket-item.entity';
import { BookingTransportItemSupplierEntity } from '../../entities/booking-transport-item-supplier.entity';
import { BookingActivityItemSupplierEntity } from '../../entities/booking-activity-item-supplier.entity';
import { BookingSpecialItemSupplierEntity } from '../../entities/booking-special-item-supplier.entity';
import { ServicePaymentCollectionEntity } from '../../entities/service-payment-collection.entity';
import { BookingCashCollectionEntity } from '../../entities/booking-cash-collection.entity';

@Module({
  imports: [
    TypeOrmModule.forFeature([
      BookingEntity,
      BookingHotelItemEntity,
      BookingHotelPeriodEntity,
      BookingHotelExtraEntity,
      BookingTransportItemEntity,
      BookingActivityItemEntity,
      BookingSpecialItemEntity,
      BookingFlightDetailEntity,
      QueryEntity,
      QueryQuoteEntity,
      QueryQuoteHotelEntity,
      QueryQuoteHotelPeriodEntity,
      QueryQuoteHotelExtraEntity,
      QueryQuoteTransportEntity,
      QueryQuoteActivityEntity,
      ActivityEntity,
      QueryQuoteSpecialEntity,
      ActivityTicketItemEntity,
      BookingTransportItemSupplierEntity,
      BookingActivityItemSupplierEntity,
      BookingSpecialItemSupplierEntity,
      // MD Payment Collection — DriverAssignmentService enriches each
      // Movement Chart op with its live requirement so the FE can
      // render status chips + filter without a separate call.
      ServicePaymentCollectionEntity,
      BookingCashCollectionEntity,
    ]),
    AuthModule,
    UserModule,
    AuditModule,
    DriverModule,
    TaxTypeModule,
    PaymentSettlementModule,
    forwardRef(() => ChangeRequestModule),
  ],
  controllers: [BookingController],
  providers: [
    BookingService,
    QuickBookingService,
    DriverAssignmentService,
    BookingItineraryService,
    MovementChartExportService,
    ActivityTicketMailService,
    BookingStatusSyncService,
    BookingPanService,
    BookingStatusSyncTask,
    BookingRepository,
  ],
  exports: [
    BookingService,
    QuickBookingService,
    DriverAssignmentService,
    BookingItineraryService,
    BookingStatusSyncService,
  ],
})
export class BookingModule {}
