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 { 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 { TripSourceEntity } from '../entities/trip-source.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 { 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 { 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 { 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 { BookingTransportItemEntity } from '../entities/booking-transport-item.entity';
import { BookingActivityItemEntity } from '../entities/booking-activity-item.entity';
import { BookingSpecialItemEntity } from '../entities/booking-special-item.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,
    RolePermissionEntity,
    TenantSettingsEntity,
    DestinationEntity,
    ServiceTypeEntity,
    TaxTypeEntity,
    TripSourceEntity,
    HotelEntity,
    TransportServiceEntity,
    ActivityEntity,
    ActivityTicketEntity,
    SupplierEntity,
    DriverEntity,
    VehicleEntity,
    CurrencyEntity,
    ExchangeRateEntity,
    SeasonEntity,
    TransportPricingEntity,
    ActivityPricingEntity,
    VehicleTypeEntity,
    QueryEntity,
    AuditLogEntity,
    QueryQuoteEntity,
    QueryQuoteHotelEntity,
    QueryQuoteTransportEntity,
    QueryQuoteActivityEntity,
    QueryQuoteSpecialEntity,
    BookingEntity,
    BookingHotelItemEntity,
    BookingTransportItemEntity,
    BookingActivityItemEntity,
    BookingSpecialItemEntity,
  ],
  migrations: ['src/database/migrations/*.ts'],
  synchronize: false,
  logging: false,
});
