/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */

import {ɵRenderFlags, ɵrenderComponent as renderComponent, ɵɵadvance, ɵɵcontainer, ɵɵcontainerRefreshEnd, ɵɵcontainerRefreshStart, ɵɵdefineComponent, ɵɵelementEnd, ɵɵelementStart, ɵɵembeddedViewEnd, ɵɵembeddedViewStart, ɵɵstyleProp, ɵɵstyling, ɵɵstylingApply, ɵɵtext, ɵɵtextInterpolate1} from '@angular/core';

import {bindAction, profile} from '../../util';
import {createDom, destroyDom, detectChanges} from '../render3/tree';
import {TreeNode, emptyTree} from '../util';

function noop() {}

export class TreeFunction {
  data: TreeNode = emptyTree;

  /** @nocollapse */
  static ngFactoryDef = () => new TreeFunction;

  /** @nocollapse */
  static ngComponentDef = ɵɵdefineComponent({
    type: TreeFunction,
    selectors: [['tree']],
    consts: 5,
    vars: 1,
    template: function(rf: ɵRenderFlags, ctx: TreeFunction) {
      // bit of a hack
      TreeTpl(rf, ctx.data);
    },
    inputs: {data: 'data'}
  });
}

export function TreeTpl(rf: ɵRenderFlags, ctx: TreeNode) {
  if (rf & ɵRenderFlags.Create) {
    ɵɵelementStart(0, 'tree');
    {
      ɵɵelementStart(1, 'span');
      ɵɵstyling();
      { ɵɵtext(2); }
      ɵɵelementEnd();
      ɵɵcontainer(3);
      ɵɵcontainer(4);
    }
    ɵɵelementEnd();
  }
  if (rf & ɵRenderFlags.Update) {
    ɵɵadvance(1);
    ɵɵstyleProp('background-color', ctx.depth % 2 ? '' : 'grey');
    ɵɵstylingApply();
    ɵɵadvance(1);
    ɵɵtextInterpolate1(' ', ctx.value, ' ');
    ɵɵcontainerRefreshStart(3);
    {
      if (ctx.left != null) {
        let rf0 = ɵɵembeddedViewStart(0, 5, 1);
        { TreeTpl(rf0, ctx.left); }
        ɵɵembeddedViewEnd();
      }
    }
    ɵɵcontainerRefreshEnd();
    ɵɵcontainerRefreshStart(4);
    {
      if (ctx.right != null) {
        let rf0 = ɵɵembeddedViewStart(0, 5, 1);
        { TreeTpl(rf0, ctx.right); }
        ɵɵembeddedViewEnd();
      }
    }
    ɵɵcontainerRefreshEnd();
  }
}

let component: TreeFunction;
if (typeof window !== 'undefined') {
  component = renderComponent(TreeFunction);
  bindAction('#createDom', () => createDom(component as any));
  bindAction('#destroyDom', () => destroyDom(component as any));
  bindAction('#detectChanges', () => detectChanges(component as any));
  bindAction(
      '#detectChangesProfile',
      profile(() => detectChanges(component as any), noop, 'detectChanges'));
  bindAction('#updateDomProfile', profile(() => createDom(component as any), noop, 'update'));
  bindAction(
      '#createDomProfile',
      profile(() => createDom(component as any), () => destroyDom(component as any), 'create'));
}