import { Module, forwardRef } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AuthModule } from '../../auth/auth.module';
import { UserModule } from '../user/user.module';
import { AuditModule } from '../audit/audit.module';
import { ChangeRequestModule } from '../change-request/change-request.module';
import { TaxTypeModule } from '../tax-type/tax-type.module';
import { QueryController } from './query.controller';
import { QueryService } from './query.service';
import { QueryRepository } from './repositories/query.repository';
import { QuoteController, QuotePriceLookupController } from './quote.controller';
import { QuoteService } from './quote.service';
import { QuoteRepository } from './repositories/quote.repository';
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 { QueryQuoteSpecialEntity } from '../../entities/query-quote-special.entity';
import { TransportPricingEntity } from '../../entities/transport-pricing.entity';
import { ActivityPricingEntity } from '../../entities/activity-pricing.entity';
import { SeasonEntity } from '../../entities/season.entity';
import { ExchangeRateEntity } from '../../entities/exchange-rate.entity';
import { ActivityEntity } from '../../entities/activity.entity';
import { CurrencyEntity } from '../../entities/currency.entity';

@Module({
  imports: [
    TypeOrmModule.forFeature([
      QueryEntity,
      QueryQuoteEntity,
      QueryQuoteHotelEntity,
      QueryQuoteHotelPeriodEntity,
      QueryQuoteHotelExtraEntity,
      QueryQuoteTransportEntity,
      QueryQuoteActivityEntity,
      QueryQuoteSpecialEntity,
      TransportPricingEntity,
      ActivityPricingEntity,
      SeasonEntity,
      ExchangeRateEntity,
      ActivityEntity,
      // Currency rounding step feeds the price-lookup base derivation
      // when an old pricing row hasn't yet been re-saved through the
      // bifurcation flow. Lets the lookup return base immediately
      // instead of waiting on a backfill pass.
      CurrencyEntity,
    ]),
    AuthModule,
    UserModule,
    AuditModule,
    forwardRef(() => ChangeRequestModule),
    TaxTypeModule,
  ],
  controllers: [QueryController, QuoteController, QuotePriceLookupController],
  providers: [QueryService, QueryRepository, QuoteService, QuoteRepository],
  exports: [QueryService, QueryRepository, QuoteService],
})
export class QueryModule {}
