import { DataSource } from 'typeorm';
import * as dotenv from 'dotenv';
import { TenantEntity } from '../entities/tenant.entity';
import { UserEntity } from '../entities/user.entity';
import { RoleEntity } from '../entities/role.entity';
import { RoleHierarchyEntity } from '../entities/role-hierarchy.entity';
import { RolePermissionEntity } from '../entities/role-permission.entity';
import { TenantSettingsEntity } from '../entities/tenant-settings.entity';
import { DestinationEntity } from '../entities/destination.entity';
import { ServiceTypeEntity } from '../entities/service-type.entity';
import { TaxTypeEntity } from '../entities/tax-type.entity';
import { TaxSlabEntity } from '../entities/tax-slab.entity';
import { TaxComponentEntity } from '../entities/tax-component.entity';
import { TripSourceEntity } from '../entities/trip-source.entity';
import { AgentCostEntity } from '../entities/agent-cost.entity';
import { HotelEntity } from '../entities/hotel.entity';
import { TransportServiceEntity } from '../entities/transport-service.entity';
import { ActivityEntity } from '../entities/activity.entity';
import { ActivityTicketEntity } from '../entities/activity-ticket.entity';
import { ActivityTicketSlotEntity } from '../entities/activity-ticket-slot.entity';
import { SupplierEntity } from '../entities/supplier.entity';
import { DriverEntity } from '../entities/driver.entity';
import { VehicleEntity } from '../entities/vehicle.entity';
import { CurrencyEntity } from '../entities/currency.entity';
import { ExchangeRateEntity } from '../entities/exchange-rate.entity';
import { SeasonEntity } from '../entities/season.entity';
import { TransportPricingEntity } from '../entities/transport-pricing.entity';
import { ActivityPricingEntity } from '../entities/activity-pricing.entity';
import { VehicleTypeEntity } from '../entities/vehicle-type.entity';
import { BankEntity } from '../entities/bank.entity';
import { BankAccountEntity } from '../entities/bank-account.entity';
import { QueryEntity } from '../entities/query.entity';
import { AuditLogEntity } from '../entities/audit-log.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 { 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 { 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 { SupplierCostPriceEntity } from '../entities/supplier-cost-price.entity';
import { ServicePaymentCollectionEntity } from '../entities/service-payment-collection.entity';
import { ServicePaymentCollectionConfirmationEntity } from '../entities/service-payment-collection-confirmation.entity';
import { BookingCashCollectionEntity } from '../entities/booking-cash-collection.entity';
import { BookingCashCollectionBatchEntity } from '../entities/booking-cash-collection-batch.entity';
import { MdCashCollectionEntity } from '../entities/md-cash-collection.entity';
import { RefreshTokenEntity } from '../entities/refresh-token.entity';
import { HotelMediaEntity } from '../entities/hotel-media.entity';
import { ActivityMediaEntity } from '../entities/activity-media.entity';
import { VehicleMediaEntity } from '../entities/vehicle-media.entity';
import { DestinationMediaEntity } from '../entities/destination-media.entity';
import { TripSourceMediaEntity } from '../entities/trip-source-media.entity';
import { ServiceTypeMediaEntity } from '../entities/service-type-media.entity';
import { VehicleTypeMediaEntity } from '../entities/vehicle-type-media.entity';

dotenv.config();

/**
 * DataSource for TypeORM CLI — used for migration generation and execution.
 *
 * Usage:
 *   npx typeorm migration:generate src/database/migrations/MigrationName -d src/database/data-source.ts
 *   npx typeorm migration:run -d src/database/data-source.ts
 *   npx typeorm migration:revert -d src/database/data-source.ts
 */
export default new DataSource({
  type: 'postgres',
  host: process.env.DB_HOST || 'localhost',
  port: parseInt(process.env.DB_PORT || '5432', 10),
  username: process.env.DB_USERNAME || 'postgres',
  password: process.env.DB_PASSWORD || '',
  database: process.env.DB_NAME || 'dmc_ops',
  entities: [
    TenantEntity,
    UserEntity,
    RoleEntity,
    RoleHierarchyEntity,
    RolePermissionEntity,
    TenantSettingsEntity,
    DestinationEntity,
    ServiceTypeEntity,
    TaxTypeEntity,
    TaxSlabEntity,
    TaxComponentEntity,
    TripSourceEntity,
    AgentCostEntity,
    HotelEntity,
    TransportServiceEntity,
    ActivityEntity,
    ActivityTicketEntity,
    ActivityTicketSlotEntity,
    SupplierEntity,
    DriverEntity,
    VehicleEntity,
    CurrencyEntity,
    ExchangeRateEntity,
    SeasonEntity,
    TransportPricingEntity,
    ActivityPricingEntity,
    VehicleTypeEntity,
    BankEntity,
    BankAccountEntity,
    QueryEntity,
    AuditLogEntity,
    QueryQuoteEntity,
    QueryQuoteHotelEntity,
    QueryQuoteHotelPeriodEntity,
    QueryQuoteHotelExtraEntity,
    QueryQuoteTransportEntity,
    QueryQuoteActivityEntity,
    QueryQuoteSpecialEntity,
    BookingEntity,
    BookingHotelItemEntity,
    BookingHotelPeriodEntity,
    BookingHotelExtraEntity,
    BookingTransportItemEntity,
    BookingActivityItemEntity,
    BookingSpecialItemEntity,
    BookingFlightDetailEntity,
    BookingTransportItemSupplierEntity,
    BookingActivityItemSupplierEntity,
    BookingSpecialItemSupplierEntity,
    SupplierCostPriceEntity,
    ServicePaymentCollectionEntity,
    ServicePaymentCollectionConfirmationEntity,
    BookingCashCollectionEntity,
    BookingCashCollectionBatchEntity,
    MdCashCollectionEntity,
    RefreshTokenEntity,
    HotelMediaEntity,
    ActivityMediaEntity,
    VehicleMediaEntity,
    DestinationMediaEntity,
    TripSourceMediaEntity,
    ServiceTypeMediaEntity,
    VehicleTypeMediaEntity,
  ],
  migrations: ['src/database/migrations/*.ts'],
  synchronize: false,
  // Per-migration transaction mode. Default ('all') wraps every
  // migration in a single transaction and forbids individual migrations
  // from opting out — which breaks 1777300000000-AddBelowFloorPriceCRKind
  // (ALTER TYPE ADD VALUE can't run inside a transaction). 'each' runs
  // each migration in its own transaction by default but lets a single
  // migration set `transaction = false` on the class to opt out.
  migrationsTransactionMode: 'each',
  logging: false,
});
