import 'dotenv/config';
import path from 'path';

const defaultDatabaseUrl = 'postgresql://postgres:password@localhost:5433/dentaflow?schema=public';

const normalizeString = (value: string | undefined) => value?.trim() ?? '';

const normalizeBoolean = (value: string | undefined, fallback: boolean) => {
  const normalizedValue = normalizeString(value).toLowerCase();

  if (['1', 'true', 'yes', 'on'].includes(normalizedValue)) {
    return true;
  }

  if (['0', 'false', 'no', 'off'].includes(normalizedValue)) {
    return false;
  }

  return fallback;
};

const appEnv = normalizeString(process.env.APP_ENV) || normalizeString(process.env.NODE_ENV) || 'development';
const isProductionLike = appEnv === 'production' || appEnv === 'staging';
const normalizedConfiguredDatabaseUrl = normalizeString(process.env.DATABASE_URL);

const databaseUrl =
  normalizedConfiguredDatabaseUrl && !normalizedConfiguredDatabaseUrl.startsWith('prisma+postgres://')
    ? normalizedConfiguredDatabaseUrl
    : isProductionLike
      ? ''
      : defaultDatabaseUrl;

process.env.DATABASE_URL = databaseUrl;

const parseList = (value: string | undefined) =>
  normalizeString(value)
    .split(',')
    .map((item) => item.trim())
    .filter(Boolean);

export const appEnvironment = appEnv;
export const isProductionEnvironment = isProductionLike;
export const allowLocalFallback = normalizeBoolean(process.env.ALLOW_LOCAL_FALLBACK, !isProductionLike);
export const backendPort = Number(process.env.PORT || 3001);
export const normalizedDatabaseUrl = databaseUrl;
export const fallbackPolicyLabel = allowLocalFallback ? 'enabled' : 'disabled';
export const serveFrontend = normalizeBoolean(process.env.SERVE_FRONTEND, isProductionLike);
export const frontendDistPath = normalizeString(process.env.FRONTEND_DIST_PATH);
export const allowedOrigins = parseList(process.env.ALLOWED_ORIGINS);
export const trustProxy = normalizeBoolean(process.env.TRUST_PROXY, isProductionLike);
export const runDbSeedOnBoot = normalizeBoolean(process.env.RUN_DB_SEED_ON_BOOT, false);
export const databasePoolMax = Number(process.env.DATABASE_POOL_MAX || 10);
export const databasePoolMin = Number(process.env.DATABASE_POOL_MIN || 0);
export const databaseConnectionTimeoutMs = Number(process.env.DATABASE_CONNECTION_TIMEOUT_MS || 10000);
export const databaseIdleTimeoutMs = Number(process.env.DATABASE_IDLE_TIMEOUT_MS || 30000);
const configuredDataDirectory = normalizeString(process.env.DATA_DIR);
export const storageDataDirectory = configuredDataDirectory
  ? path.isAbsolute(configuredDataDirectory)
    ? configuredDataDirectory
    : path.resolve(__dirname, configuredDataDirectory)
  : path.resolve(__dirname, '../../data');
