/** Active database selector — mongodb (legacy) | mysql (target). */
export type ActiveDatabase = "mongodb" | "mysql";

export function getActiveDatabase(): ActiveDatabase {
  const v = (process.env.ACTIVE_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isMysqlActive() {
  return getActiveDatabase() === "mysql";
}

export function isMongoActive() {
  return getActiveDatabase() === "mongodb";
}

/**
 * Per-module DB for cities routes/helpers only.
 * Independent of ACTIVE_DATABASE so other routes can stay on Mongo.
 * Default: mysql (data already migrated). Set CITIES_DATABASE=mongodb to roll back cities only.
 */
export function getCitiesDatabase(): ActiveDatabase {
  const v = (process.env.CITIES_DATABASE || "mysql").toLowerCase().trim();
  return v === "mongodb" ? "mongodb" : "mysql";
}

export function isCitiesMysql() {
  return getCitiesDatabase() === "mysql";
}

/**
 * Contact module DB switch (independent of ACTIVE_DATABASE / CITIES_DATABASE).
 * Default: mongodb until explicitly enabled.
 */
export function getContactDatabase(): ActiveDatabase {
  const v = (process.env.CONTACT_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isContactMysql() {
  return getContactDatabase() === "mysql";
}

/**
 * Notifications module DB switch (independent).
 * Default: mongodb until explicitly enabled.
 */
export function getNotificationsDatabase(): ActiveDatabase {
  const v = (process.env.NOTIFICATIONS_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isNotificationsMysql() {
  return getNotificationsDatabase() === "mysql";
}

/**
 * Favorites module DB switch (independent).
 * Favorite rows use MySQL; property join may still use Mongo until properties migrate.
 * Default: mongodb until explicitly enabled.
 */
export function getFavoritesDatabase(): ActiveDatabase {
  const v = (process.env.FAVORITES_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isFavoritesMysql() {
  return getFavoritesDatabase() === "mysql";
}

/**
 * Reviews module DB switch (independent).
 * Booking eligibility checks may still use Mongo until bookings migrate.
 * Default: mongodb until explicitly enabled.
 */
export function getReviewsDatabase(): ActiveDatabase {
  const v = (process.env.REVIEWS_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isReviewsMysql() {
  return getReviewsDatabase() === "mysql";
}

/**
 * Properties module DB switch (independent).
 * Availability holds still use Mongo bookings until bookings migrate.
 * Default: mongodb until explicitly enabled.
 */
export function getPropertiesDatabase(): ActiveDatabase {
  const v = (process.env.PROPERTIES_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isPropertiesMysql() {
  return getPropertiesDatabase() === "mysql";
}

/**
 * Loyalty module DB switch (accounts + txns). Commerce settings follow SETTINGS_DATABASE.
 * Default: mongodb until explicitly enabled.
 */
export function getLoyaltyDatabase(): ActiveDatabase {
  const v = (process.env.LOYALTY_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isLoyaltyMysql() {
  return getLoyaltyDatabase() === "mysql";
}

/**
 * App settings (commerce / rates config) DB switch.
 * Default: mongodb until explicitly enabled.
 */
export function getSettingsDatabase(): ActiveDatabase {
  const v = (process.env.SETTINGS_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isSettingsMysql() {
  return getSettingsDatabase() === "mysql";
}

/**
 * Auth module: users (auth paths) + refresh/reset/verify tokens + OTP.
 * Uploads passport/verification also follow this when enabled.
 * Default: mongodb until explicitly enabled.
 */
export function getAuthDatabase(): ActiveDatabase {
  const v = (process.env.AUTH_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isAuthMysql() {
  return getAuthDatabase() === "mysql";
}

/**
 * Dashboard assembly switch (hybrid OK):
 * When mysql, prefer migrated modules (properties/favorites/reviews/notifications/users/cities/contact)
 * while bookings / withdrawals / exchange may still come from Mongo until those modules cut over.
 */
export function getDashboardDatabase(): ActiveDatabase {
  const v = (process.env.DASHBOARD_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isDashboardMysql() {
  return getDashboardDatabase() === "mysql";
}

/**
 * Bookings module DB switch (independent).
 * READ adapters exist; keep mongodb until an explicit read/write cutover is approved.
 * Default: mongodb.
 */
export function getBookingsDatabase(): ActiveDatabase {
  const v = (process.env.BOOKINGS_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isBookingsMysql() {
  return getBookingsDatabase() === "mysql";
}

/**
 * Wallets module (wallets + wallet_txns + wallet_topups).
 * READ adapters exist; no write cutover yet. Default: mongodb.
 */
export function getWalletsDatabase(): ActiveDatabase {
  const v = (process.env.WALLETS_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isWalletsMysql() {
  return getWalletsDatabase() === "mysql";
}

/**
 * Ledger entries module.
 * READ cutover via LEDGER_DATABASE=mysql (default mongodb).
 * Writes remain Mongo-primary + dual-write until hybrid teardown is approved.
 */
export function getLedgerDatabase(): ActiveDatabase {
  const v = (process.env.LEDGER_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isLedgerMysql() {
  return getLedgerDatabase() === "mysql";
}

/**
 * Withdrawal requests module.
 * READ via WITHDRAWALS_DATABASE=mysql. Writes remain Mongo-primary + financial dual-write.
 */
export function getWithdrawalsDatabase(): ActiveDatabase {
  const v = (process.env.WITHDRAWALS_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isWithdrawalsMysql() {
  return getWithdrawalsDatabase() === "mysql";
}

/**
 * Refunds module.
 * READ via REFUNDS_DATABASE=mysql. Writes remain Mongo-primary + financial dual-write.
 */
export function getRefundsDatabase(): ActiveDatabase {
  const v = (process.env.REFUNDS_DATABASE || "mongodb").toLowerCase().trim();
  return v === "mysql" ? "mysql" : "mongodb";
}

export function isRefundsMysql() {
  return getRefundsDatabase() === "mysql";
}
