/**
 * Manages the creation and retrieval of pages (route + controller)
 */
export abstract class PageService implements ng.IServiceProvider {

  /**
   * Create a page.
   * @param pageName The name of the page.
   * @param templateName The file name of the template.
   * @param controller Controller for the page.
   * @param flags Additional flags passed to route provider.
   * @param profiles Available profiles.
   */
  public abstract create(pageName: string,
                         templateName: string,
                         controller?: any,
                         flags?: any,
                         profiles?: string[]): void;

  /**
   * Retrieve a registered page.
   * @param pageName The name of the page.
   * @param profiles Available profiles to search.
   */
  public abstract get(pageName: string, profiles: QuayPageProfile[]): [QuayPageProfile, QuayPage] | null;

  /**
   * Provide the service instance.
   * @return pageService The singleton service instance.
   */
  public abstract $get(): PageService;
}


/**
 * A type representing a registered application page.
 */
export type QuayPage = {
  name: string;
  controller: ng.IController;
  templateName: string,
  flags: {[key: string]: any};
};


/**
 * Represents a page profile type.
 */
export type QuayPageProfile = {
  id: string;
  templatePath: string;
};