// #docregion
import {Component, DoCheck, OnChanges, Input, SimpleChange, ViewChild} from 'angular2/core';
class Hero {
  constructor(public name:string){}
}
@Component({
  selector: 'do-check',
  template: `
  
    {{hero.name}} can {{power}}
    -- Change Log --
    {{chg}}
   
  `,
  styles: [
    '.hero {background: LightYellow; padding: 8px; margin-top: 8px}',
    'p {background: Yellow; padding: 8px; margin-top: 8px}'
  ]
})
export class DoCheckComponent implements DoCheck, OnChanges {
  @Input() hero: Hero;
  @Input() power: string;
  changeDetected = false;
  changeLog:string[] = [];
  oldHeroName = '';
  oldPower = '';
  oldLogLength = 0;
  noChangeCount = 0;
  // #docregion ng-do-check
  ngDoCheck() {
    if (this.hero.name !== this.oldHeroName) {
      this.changeDetected = true;
      this.changeLog.push(`DoCheck: Hero name changed to "${this.hero.name}" from "${this.oldHeroName}"`)
      this.oldHeroName = this.hero.name;
    }
    if (this.power !== this.oldPower) {
      this.changeDetected = true;
      this.changeLog.push(`DoCheck: Power changed to "${this.power}" from "${this.oldPower}"`)
      this.oldPower = this.power;
    }
    if (this.changeDetected) {
        this.noChangeCount = 0;
    } else {
        // log that hook was called when there was no relevant change.
        let count = this.noChangeCount += 1
        let noChangeMsg = `DoCheck called ${count}x when no change to hero or power`;
        if (count === 1) {
          // add new "no change" message
          this.changeLog.push(noChangeMsg);
        } else {
          // update last "no change" message
          this.changeLog[this.changeLog.length-1] = noChangeMsg;
        }
    }
    this.changeDetected = false;
  }
  // #enddocregion ng-do-check
  // Copied from OnChangesComponent
  ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {
    for (let propName in changes) {
      let prop = changes[propName];
      let cur  = JSON.stringify(prop.currentValue)
      let prev = JSON.stringify(prop.previousValue);
      this.changeLog.push(`OnChanges: ${propName}: currentValue = ${cur}, previousValue = ${prev}`);
    }
  }
  reset() {
    this.changeDetected = true;
    this.changeLog.length = 0;
  }
}
/***************************************/
@Component({
  selector: 'do-check-parent',
  templateUrl:'app/on-changes-parent.component.html',
  styles: ['.parent {background: Lavender}'],
  directives: [DoCheckComponent]
})
export class DoCheckParentComponent {
  hero:Hero;
  power:string;
  title = 'DoCheck';
  @ViewChild(DoCheckComponent) childView:DoCheckComponent;
  constructor() { this.reset(); }
  reset(){
    this.hero = new Hero('Windstorm');
    this.power = 'sing';
    this.childView && this.childView.reset();
  }
}