export type NodeEnv = 'development' | 'test' | 'production';

function splitCsv(value: string | undefined): string[] {
  if (!value) return [];
  return value
    .split(',')
    .map((v) => v.trim())
    .filter(Boolean);
}

export function configuration() {
  const nodeEnv = (process.env.NODE_ENV ?? 'development') as NodeEnv;

  return {
    app: {
      env: nodeEnv,
      name: process.env.APP_NAME ?? 'cashi-backend',
      port: Number(process.env.PORT ?? 3000),
      trustProxy: process.env.TRUST_PROXY === 'true',
    },
    cors: {
      origins: splitCsv(process.env.CORS_ORIGINS),
      credentials: process.env.CORS_CREDENTIALS === 'true',
    },
    database: {
      url: process.env.DATABASE_URL,
    },
    jwt: {
      secret: process.env.JWT_SECRET,
      expiresIn: process.env.JWT_EXPIRES_IN ?? '365d',
    },
    throttle: {
      ttlSeconds: Number(process.env.THROTTLE_TTL_SECONDS ?? 60),
      limit: Number(process.env.THROTTLE_LIMIT ?? 120),
    },
    swagger: {
      enabled:
        process.env.SWAGGER_ENABLED != null
          ? process.env.SWAGGER_ENABLED === 'true'
          : nodeEnv !== 'production',
      path: process.env.SWAGGER_PATH ?? 'docs',
    },
    auth: {
      returnDevOtp: process.env.RETURN_DEV_OTP === 'true',
    },
    sms: {
      metareach: {
        baseUrl:
          process.env.METAREACH_SMS_BASE_URL ??
          'https://sms.metareach.in/vb/apikey.php',
        apiKey: process.env.METAREACH_SMS_API_KEY,
        senderId: process.env.METAREACH_SMS_SENDER_ID,
        templateId: process.env.METAREACH_SMS_TEMPLATE_ID,
      },
    },
    mail: {
      enabled: process.env.MAIL_ENABLED === 'true',
      host: process.env.SMTP_HOST,
      port: Number(process.env.SMTP_PORT ?? 25),
      secure: process.env.SMTP_SECURE === 'true',
      requireTls: process.env.SMTP_REQUIRE_TLS === 'true',
      user: process.env.SMTP_USER,
      pass: process.env.SMTP_PASS,
      fromMail: process.env.FROM_MAIL,
      fromName: process.env.FROM_NAME ?? 'Cashi Family',
      replyMail: process.env.REPLY_MAIL,
      replyName: process.env.REPLY_NAME ?? process.env.FROM_NAME ?? 'Cashi Family',
      supportEmail:
        process.env.SUPPORT_EMAIL ??
        process.env.REPLY_MAIL ??
        process.env.FROM_MAIL,
      brandName: process.env.MAIL_BRAND_NAME ?? 'Cashi Family',
      merchantPortalUrl:
        process.env.MERCHANT_PORTAL_URL ?? process.env.APP_PUBLIC_URL,
      appUrl: process.env.CASHI_APP_URL ?? process.env.APP_PUBLIC_URL,
    },
    payments: {
      publicUrl:
        process.env.APP_PUBLIC_URL ??
        `http://localhost:${Number(process.env.PORT ?? 3000)}`,
      easebuzz: {
        apiPath: process.env.EASEBUZZ_API_PATH ?? 'https://pay.easebuzz.in',
        payPath:
          process.env.EASEBUZZ_PAY_PATH ?? 'https://pay.easebuzz.in/pay/',
        key: process.env.EASEBUZZ_API_KEY,
        salt: process.env.EASEBUZZ_API_SALT,
      },
    },
  };
}
