// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:html';

import 'package:observatory/app.dart';
import 'package:observatory/src/elements/helpers/tag.dart';
import 'package:observatory/src/elements/shims/binding.dart';
import 'package:observatory/src/elements/nav/top_menu.dart';

@bindable
class NavTopMenuElementWrapper extends HtmlElement {
  static const binder = const Binder<NavTopMenuElementWrapper>(const {
      'last': #last
    });

  static const tag = const Tag<NavTopMenuElementWrapper>('top-nav-menu');

  bool _last = false;
  
  bool get last => _last;

  set last(bool value) {
    _last = value;
    render();
  }

  NavTopMenuElementWrapper.created() : super.created() {
    binder.registerCallback(this);
    _last = _getBoolAttribute('last');
    createShadowRoot();
    render();
  }

  @override
  void attached() {
    super.attached();
    render();
  }

  void render() {
    shadowRoot.children = [];
    if (_last == null) {
      return;
    }

    shadowRoot.children = [
      new NavTopMenuElement(last: last, queue: ObservatoryApplication.app.queue)
        ..children = [new ContentElement()]
    ];
  }

  bool _getBoolAttribute(String name) {
    final String value = getAttribute(name);
    return !(value == null || value == 'false');
  }
}
