import { DataSource, DataSourceOptions } from 'typeorm';
import { ConfigService } from '@nestjs/config';
import * as dotenv from 'dotenv';
import { BreachRecord } from '../../modules/feature/can/have-i-been-pawned/entities/breach-data.entity';
import { BreachedRecordIdentifier } from '../../modules/feature/can/have-i-been-pawned/entities/identifier.entity';
import { AsnEntity } from '../../modules/feature/can/csv-import/entities/asn.entity';
import { CityBlockIpv4, CityBlockIpv6 } from '../../modules/feature/can/csv-import/entities/city.entity';
import { GeoName } from '../../modules/feature/can/csv-import/entities/geoname.entity';

dotenv.config();

export const getDatabaseConfig = (configService: ConfigService): DataSourceOptions => {
  const isProduction = configService.get<string>('NODE_ENV') === 'production';

  return {
    type: 'mysql',
    host: configService.get<string>('MYSQL_HOST'),
    port: configService.get<number>('MYSQL_PORT'),
    username: configService.get<string>('MYSQL_USER'),
    password: configService.get<string>('MYSQL_PASSWORD'),
    database: configService.get<string>('MYSQL_DB'),
    // working
    // NOTE: If migration revert is not working, try to remove the entities from the config
    entities: ['dist/**/*.entity{.ts,.js}', BreachRecord, BreachedRecordIdentifier, AsnEntity, CityBlockIpv4, CityBlockIpv6, GeoName],
    migrations: ['dist/migrations/*{.ts,.js}'],
    // ----
    // not working when trying to create data of roles and permissions
    // entities: [`{${isProduction ? 'dist' : 'src'}}/**/*.entity{.ts,.js}`],
    // migrations: [`{${isProduction ? 'dist' : 'src'}}/migrations/*{.ts,.js}`],
    // ----
    // not working from start (invalid token error)
    // entities: [isProduction ? './dist/**/*.entity.js' : './src/**/*.entity.ts'],
    // migrations: [isProduction ? './dist/migrations/*.js' : './src/migrations/*.ts'],
    synchronize: false,
    logging: false,
    migrationsRun: false,
    migrationsTableName: 'migrations',
    charset: 'utf8mb4',
  };
};

const configService = new ConfigService();
export const AppDataSource = new DataSource(getDatabaseConfig(configService));
