// 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 'dart:async';
import 'package:observatory/src/elements/helpers/tag.dart';
import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';

class NavMenuItemElement extends HtmlElement implements Renderable {
  static final StyleElement _style = () {
      var style = new StyleElement();
      style.text = '''li.nav-menu-item {
                        float: none;
                        border-top: 1px solid #677;
                        border-bottom: 1px solid #556; position: relative;
                      }
                      li.nav-menu-item:hover {
                        background: #455;
                      }
                      li.nav-menu-item > a {
                        display: block;
                        padding: 12px 12px;
                        color: white;
                        text-decoration: none;
                      }
                      li.nav-menu-item > ul {
                        display: none;
                        position: absolute;
                        top:0;
                        left: 100%;
                        list-style: none;
                        padding: 0;
                        margin-left: 0;
                        width: auto;
                        z-index: 1000;
                        font: 400 16px \'Montserrat\', sans-serif;
                        color: white;
                        background: #567;
                      }
                      li.nav-menu-item > ul:after {
                        content: ""; clear: both; display: block;
                      }
                      li.nav-menu-item:hover > ul {
                        display: block;
                      }''';
      return style;
  }();

  static const tag = const Tag<NavMenuItemElement>('nav-menu-item-wrapped');

  RenderingScheduler _r;

  Stream<RenderedEvent<NavMenuItemElement>> get onRendered => _r.onRendered;

  String _label;
  String _link;

  String get label => _label;
  String get link => _link;
  
  set label(String value) => _label = _r.checkAndReact(_label, value);
  set link(String value) => _link = _r.checkAndReact(_link, value);


  factory NavMenuItemElement(String label, {String link,
                             RenderingQueue queue}) {
    assert(label != null);
    NavMenuItemElement e = document.createElement(tag.name);
    e._r = new RenderingScheduler(e, queue: queue);
    e._label = label;
    e._link = link;
    return e;
  }

  NavMenuItemElement.created() : super.created() { createShadowRoot(); }

  @override
  void attached() {
    super.attached();
    _r.enable();
  }

  @override
  void detached() {
    super.detached();
    _r.disable(notify: true);
    shadowRoot.children = [];
  }

  void render() {
    shadowRoot.children = [
      _style.clone(true),
      new LIElement()
        ..classes = ['nav-menu-item']
        ..children = [
          new AnchorElement(href: link)
            ..text = label,
          new UListElement()
            ..children = [
              new ContentElement()
            ]
        ]
    ];
  }
}
