/**
 * 🔑 Claves de proyección comunes para seleccionar mappers de dominio y de consulta.
 */

export type MapperKey = {
  resource: string;
  query: "LIST" | "REPORT" | (string & {}); // "SUMMARY", "EXPORT", etc.
};

export type MapperDomainKey = Pick<MapperKey, "resource">;

export type MapperQueryKey = MapperKey;

/**
 * 🏗️ Registro/Fábrica de mappers (Strategy/Factory)
 * - Permite resolver diferentes mappers según la consulta (FULL, SUMMARY, etc.)
 * - Facilita inyección y test (DIP), evitando dependencias duras en implementaciones concretas.
 *
 */

export interface IMapperRegistry {
  /**
   * Obtiene un mapper de dominio por clave de proyección.
   */
  getDomainMapper<T>(key: MapperDomainKey): T;

  /**
   * Obtiene un mapper de read model por clave de proyección.
   */
  getQueryMapper<T>(key: MapperQueryKey): T;

  /**
   * Registra mapper de dominio bajo una clave de proyección.
   */
  registerDomainMapper<T>(key: MapperDomainKey, mapper: T): this;

  /**
   * Registra un mapper de query / read model bajo una clave de proyección.
   */
  registerQueryMapper<T>(key: MapperQueryKey, mapper: T): this;
  registerQueryMappers(mappers: Array<{ key: MapperQueryKey; mapper: any }>): this;
}
