import { createApp } from "@/app";
import { env } from "@/config/env";
import {
  getActiveDatabase,
  getCitiesDatabase,
  getContactDatabase,
  getNotificationsDatabase,
  getFavoritesDatabase,
  getReviewsDatabase,
  getPropertiesDatabase,
  getLoyaltyDatabase,
  getSettingsDatabase,
  getAuthDatabase,
  getDashboardDatabase,
  getBookingsDatabase,
  getWalletsDatabase,
  getLedgerDatabase,
  getWithdrawalsDatabase,
  getRefundsDatabase,
  isMysqlActive,
  isMongoActive,
  isCitiesMysql,
  isContactMysql,
  isNotificationsMysql,
  isFavoritesMysql,
  isReviewsMysql,
  isPropertiesMysql,
  isLoyaltyMysql,
  isSettingsMysql,
  isAuthMysql,
  isDashboardMysql,
  isBookingsMysql,
  isWalletsMysql,
  isLedgerMysql,
  isWithdrawalsMysql,
  isRefundsMysql,
} from "@/db/activeDatabase";
import { connectDb, disconnectDb } from "@/db/mongoose";
import { connectMysql, disconnectMysql } from "@/db/mysql/pool";
import { migrateAdminRoles } from "@/services/adminMigration";

async function main() {
  const active = getActiveDatabase();
  const citiesDb = getCitiesDatabase();
  const contactDb = getContactDatabase();
  const notificationsDb = getNotificationsDatabase();
  const favoritesDb = getFavoritesDatabase();
  const reviewsDb = getReviewsDatabase();
  const propertiesDb = getPropertiesDatabase();
  const loyaltyDb = getLoyaltyDatabase();
  const settingsDb = getSettingsDatabase();
  const authDb = getAuthDatabase();
  const dashboardDb = getDashboardDatabase();
  const bookingsDb = getBookingsDatabase();
  const walletsDb = getWalletsDatabase();
  const ledgerDb = getLedgerDatabase();
  const withdrawalsDb = getWithdrawalsDatabase();
  const refundsDb = getRefundsDatabase();

  for (const [k, v] of Object.entries({
    ACTIVE_DATABASE: active,
    CITIES_DATABASE: citiesDb,
    CONTACT_DATABASE: contactDb,
    NOTIFICATIONS_DATABASE: notificationsDb,
    FAVORITES_DATABASE: favoritesDb,
    REVIEWS_DATABASE: reviewsDb,
    PROPERTIES_DATABASE: propertiesDb,
    LOYALTY_DATABASE: loyaltyDb,
    SETTINGS_DATABASE: settingsDb,
    AUTH_DATABASE: authDb,
    DASHBOARD_DATABASE: dashboardDb,
    BOOKINGS_DATABASE: bookingsDb,
    WALLETS_DATABASE: walletsDb,
    LEDGER_DATABASE: ledgerDb,
    WITHDRAWALS_DATABASE: withdrawalsDb,
    REFUNDS_DATABASE: refundsDb,
    DUAL_WRITE: process.env.DUAL_WRITE || "true",
  })) {
    console.log(`[db] ${k}=${v}`);
  }

  if (isMysqlActive()) {
    await connectMysql();
    console.log(`[db] MySQL connected for ACTIVE_DATABASE (${env.MYSQL_DATABASE})`);
  } else {
    await connectDb();
    const migration = await migrateAdminRoles();
    console.log("[rbac] admin role migration", migration);
  }

  const anyModuleMysql =
    isCitiesMysql() ||
    isContactMysql() ||
    isNotificationsMysql() ||
    isFavoritesMysql() ||
    isReviewsMysql() ||
    isPropertiesMysql() ||
    isLoyaltyMysql() ||
    isSettingsMysql() ||
    isAuthMysql() ||
    isDashboardMysql() ||
    isBookingsMysql() ||
    isWalletsMysql() ||
    isLedgerMysql() ||
    isWithdrawalsMysql() ||
    isRefundsMysql();
  if (anyModuleMysql && !isMysqlActive()) {
    await connectMysql();
    console.log(`[db] MySQL connected for module DB switches (${env.MYSQL_DATABASE})`);
  }

  const app = createApp();
  app.listen(env.PORT, "0.0.0.0", () => {
    console.log(`API listening on http://0.0.0.0:${env.PORT} (LAN + localhost)`);
    console.log(`Local:   http://localhost:${env.PORT}`);
    console.log(
      `Database mode: app=${active} dashboard=${dashboardDb} auth=${authDb} cities=${citiesDb} dualWrite=${process.env.DUAL_WRITE || "true"}`,
    );
  });
}

main().catch(async (error) => {
  console.error(error);
  if (isMongoActive()) await disconnectDb();
  try {
    await disconnectMysql();
  } catch {
    /* ignore */
  }
  process.exit(1);
});
