// 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/service.dart';
import 'package:observatory/src/elements/helpers/tag.dart';
import 'package:observatory/src/elements/shims/binding.dart';
import 'package:observatory/src/elements/nav/class_menu.dart';

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

  static const tag =
    const Tag<NavClassMenuElementWrapper>('class-nav-menu');

  bool _last = false;
  Class _cls;

  bool get last => _last;
  Class get cls => _cls;
  
  set last(bool value) {
    _last = value;
    render();
  }
  set cls(Class value) {
    _cls = value;
    render();
  }

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

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

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

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

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