import { ConfigService } from '@nestjs/config';

export function getRequiredNumber(config: ConfigService, key: string): number {
  const value = config.getOrThrow<string | number>(key);
  const parsed = Number(value);

  if (Number.isNaN(parsed)) {
    throw new Error(`Invalid number for ${key}`);
  }

  return parsed;
}

export function getRequiredBoolean(
  config: ConfigService,
  key: string,
): boolean {
  const value = config.getOrThrow<string | boolean>(key);

  if (typeof value === 'boolean') {
    return value;
  }

  const normalized = value.toLowerCase();
  if (normalized === 'true') {
    return true;
  }
  if (normalized === 'false') {
    return false;
  }

  throw new Error(`Invalid boolean for ${key}`);
}

export function getRequiredString(config: ConfigService, key: string): string {
  const value = config.getOrThrow<string>(key);
  if (typeof value !== 'string') {
    throw new Error(`Invalid string for ${key}`);
  }

  const trimmed = value.trim();
  if (trimmed.length === 0) {
    throw new Error(`Invalid string for ${key}`);
  }

  return trimmed;
}

export function getRequiredEnum<T extends string>(
  config: ConfigService,
  key: string,
  allowed: readonly T[],
): T {
  const value = getRequiredString(config, key);
  if (!allowed.includes(value as T)) {
    throw new Error(
      `Invalid value for ${key}. Expected one of: ${allowed.join(', ')}`,
    );
  }

  return value as T;
}
