export type DbDriver = 'sqlite' | 'mysql' | 'postgres';

export interface AppConfig {
  port: number;
  nodeEnv: string;
  jwt: {
    secret: string;
    expiresIn: string;
  };
  db: {
    driver: DbDriver;
    mysql: {
      host: string;
      port: number;
      user: string;
      password: string;
      landlordDb: string;
      tenantDbPrefix: string;
    };
    postgres: {
      host: string;
      port: number;
      user: string;
      password: string;
      database: string;
      landlordSchema: string;
      tenantSchemaPrefix: string;
    };
    sqlite: {
      dataDir: string;
      landlordFile: string;
      tenantDir: string;
    };
  };
  webOrigin: string;
}

export default (): AppConfig => ({
  port: Number(process.env.PORT ?? 8080),
  nodeEnv: process.env.NODE_ENV ?? 'development',
  jwt: {
    secret: process.env.JWT_SECRET ?? 'dev-secret-change-me',
    expiresIn: process.env.JWT_EXPIRES_IN ?? '1d',
  },
  db: {
    driver: (process.env.DB_DRIVER as DbDriver) ?? 'sqlite',
    mysql: {
      host: process.env.MYSQL_HOST ?? '127.0.0.1',
      port: Number(process.env.MYSQL_PORT ?? 3306),
      user: process.env.MYSQL_USER ?? 'root',
      password: process.env.MYSQL_PASSWORD ?? '',
      landlordDb: process.env.MYSQL_LANDLORD_DB ?? 'cooperative_landlord',
      tenantDbPrefix: process.env.MYSQL_TENANT_DB_PREFIX ?? 'tenant_',
    },
    postgres: {
      host:     process.env.PGHOST     ?? '127.0.0.1',
      port:     Number(process.env.PGPORT ?? 5432),
      user:     process.env.PGUSER     ?? 'postgres',
      password: process.env.PGPASSWORD ?? '',
      database: process.env.PGDATABASE ?? 'replit',
      landlordSchema:     process.env.PG_LANDLORD_SCHEMA      ?? 'landlord',
      tenantSchemaPrefix: process.env.PG_TENANT_SCHEMA_PREFIX ?? 'tenant_',
    },
    sqlite: {
      dataDir: process.env.SQLITE_DATA_DIR ?? '.data',
      landlordFile: process.env.SQLITE_LANDLORD_FILE ?? 'landlord.sqlite',
      tenantDir: process.env.SQLITE_TENANT_DIR ?? 'tenants',
    },
  },
  webOrigin: process.env.WEB_ORIGIN ?? '*',
});
