import { getAddress, isAddress, type Address } from 'viem';

export function isRecord(value: unknown): value is Record<string, unknown> {
  return typeof value === 'object' && value !== null;
}

export function coerceString(value: unknown): string | null {
  if (typeof value === 'string') {
    const trimmed = value.trim();
    if (trimmed.length > 0) return trimmed;
  }
  return null;
}

export function getErrorMessage(error: unknown, fallback: string): string {
  if (error instanceof Error) {
    // viem's BaseError extends Error and exposes a terse shortMessage; prefer it.
    const short = coerceString((error as unknown as Record<string, unknown>).shortMessage);
    if (short) return short;
    const msg = coerceString(error.message);
    if (msg) return msg;
  }
  if (isRecord(error)) {
    const short = coerceString(error.shortMessage);
    if (short) return short;
    const msg = coerceString(error.message);
    if (msg) return msg;
  }
  return fallback;
}

export function ensureAddress(value: string, label: string): Address {
  if (!value || !isAddress(value)) {
    throw new Error(`${label} is not a valid address`);
  }
  return getAddress(value);
}
