import type { Maybe } from './Maybe.ts';
import type {
  ReadOnlyObjMap,
  ReadOnlyObjMapLike,
  ReadOnlyObjMapSymbolLike,
  ReadOnlyObjMapWithSymbol,
} from './ObjMap.ts';

/** @internal */
export function toObjMap<T>(
  obj: Maybe<ReadOnlyObjMapLike<T>>,
): ReadOnlyObjMap<T> {
  if (obj == null) {
    return Object.create(null);
  }

  if (Object.getPrototypeOf(obj) === null) {
    return obj;
  }

  const map = Object.create(null);
  for (const [key, value] of Object.entries(obj)) {
    map[key] = value;
  }

  return map;
}

/** @internal */
export function toObjMapWithSymbols<T>(
  obj: Maybe<ReadOnlyObjMapSymbolLike<T>>,
): ReadOnlyObjMapWithSymbol<T> {
  if (obj == null) {
    return Object.create(null);
  }

  if (Object.getPrototypeOf(obj) === null) {
    return obj;
  }

  const map = Object.create(null);
  for (const [key, value] of Object.entries(obj)) {
    map[key] = value;
  }

  for (const key of Object.getOwnPropertySymbols(obj)) {
    map[key] = obj[key];
  }

  return map;
}