/* tslint:disable:one-line:check-open-brace*/
// #docplaster
// #docregion opaque-token
import { OpaqueToken } from '@angular/core';
export const TITLE = new OpaqueToken('title');
// #enddocregion opaque-token
// #docregion hero-of-the-month
import { Component, Inject } from '@angular/core';
import { DateLoggerService,
         MinimalLogger }     from './date-logger.service';
import { Hero }              from './hero';
import { HeroService }       from './hero.service';
import { LoggerService }     from './logger.service';
import { RUNNERS_UP,
         runnersUpFactory }  from './runners-up';
// #enddocregion hero-of-the-month
// #docregion some-hero
const someHero = new Hero(42, 'Magma', 'Had a great month!', '555-555-5555');
// #enddocregion some-hero
const template = `
  
{{title}}
  Winner: {{heroOfTheMonth.name}}
  Reason for award: {{heroOfTheMonth.description}}
  Runners-up: {{runnersUp}}
  Logs:
  
  `;
// #docregion hero-of-the-month
@Component({
  selector: 'hero-of-the-month',
  template: template,
  providers: [
    // #docregion use-value
    { provide: Hero,          useValue:    someHero },
    // #docregion provide-opaque-token
    { provide: TITLE,         useValue:   'Hero of the Month' },
    // #enddocregion provide-opaque-token
    // #enddocregion use-value
    // #docregion use-class
    { provide: HeroService,   useClass:    HeroService },
    { provide: LoggerService, useClass:    DateLoggerService },
    // #enddocregion use-class
    // #docregion use-existing
    { provide: MinimalLogger, useExisting: LoggerService },
    // #enddocregion use-existing
    // #docregion provide-opaque-token, use-factory
    { provide: RUNNERS_UP,    useFactory:  runnersUpFactory(2), deps: [Hero, HeroService] }
    // #enddocregion provide-opaque-token, use-factory
  ]
})
export class HeroOfTheMonthComponent {
  logs: string[] = [];
// #docregion ctor-signature
  constructor(
      logger: MinimalLogger,
      public heroOfTheMonth: Hero,
      @Inject(RUNNERS_UP) public runnersUp: string,
      @Inject(TITLE) public title: string)
// #enddocregion ctor-signature
  {
    this.logs = logger.logs;
    logger.logInfo('starting up');
  }
}
// #enddocregion hero-of-the-month