/**
 * Represent a Macro found in a template. If should be stored as an array to represent 'sub level' in the macro.
 *
 * Examples (with Handlebars macros):
 * `{{HELLO_WORLD}}` should return { "parts": ["HELLO_WORLD"]}
 * `{{HELLO.WORLD}}` should return { "parts": ["HELLO", "WORLD"] }
 */
export interface TemplateMacro {
  parts: string[];
}

/**
 * Basic interface for templating engines.
 *  `init()` should be called by the Plugin impl. in order to initialize the templating engine
 *  `compile()` should be called in order to generate a compiled version of the template that will be used to render the final HTML
 */
export interface TemplatingEngine<Opt, In, Out> {
  init: (opts?: Opt) => void;
  compile: (template: In) => Out;
}

/**
 * Allow the Plugin Impl. to look into the internals of the templating engine.
 */
export interface ExploreableInternalsTemplatingEngine<Opt, In, Out, Internals> extends TemplatingEngine<Opt, In, Out> {
  /**
   * Take the template and expose its internal representation of it
   */
  parse: (template: In) => Internals;
  /**
   * Can extract a list of macros from an internal representation of a template
   */
  getMacros: (internal: Internals) => TemplateMacro[];
  /**
   * Compile the template, either directly or with the Internals directly (for performance concerns: it's better to not do the parsing twice)
   */
  compile: (template: In | Internals) => Out;
}

/**
 * Allow the Plugin Impl. to provide some Profile Data to the Templating engine through a Provider function
 */
export interface ProfileDataTemplater {
  enableProfileDataLayer(): void;
}
