// Copyright (c) 2013, 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.

library isolate_view_element;

import 'dart:async';
import 'dart:html';
import 'package:observatory/models.dart' as M;
import 'package:observatory/src/elements/curly_block.dart';
import 'package:observatory/src/elements/eval_box.dart';
import 'package:observatory/src/elements/function_ref.dart';
import 'package:observatory/src/elements/helpers/nav_bar.dart';
import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory/src/elements/helpers/tag.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
import 'package:observatory/src/elements/isolate/location.dart';
import 'package:observatory/src/elements/isolate/run_state.dart';
import 'package:observatory/src/elements/isolate/shared_summary.dart';
import 'package:observatory/src/elements/library_ref.dart';
import 'package:observatory/src/elements/nav/class_menu.dart';
import 'package:observatory/src/elements/nav/isolate_menu.dart';
import 'package:observatory/src/elements/nav/notify.dart';
import 'package:observatory/src/elements/nav/refresh.dart';
import 'package:observatory/src/elements/nav/top_menu.dart';
import 'package:observatory/src/elements/nav/vm_menu.dart';
import 'package:observatory/src/elements/script_inset.dart';
import 'package:observatory/src/elements/source_inset.dart';
import 'package:observatory/src/elements/view_footer.dart';
import 'package:observatory/utils.dart';

class IsolateViewElement extends HtmlElement implements Renderable {
  static const tag =
      const Tag<IsolateViewElement>('isolate-view', dependencies: const [
    CurlyBlockElement.tag,
    EvalBoxElement.tag,
    FunctionRefElement.tag,
    IsolateLocationElement.tag,
    IsolateRunStateElement.tag,
    IsolateSharedSummaryElement.tag,
    LibraryRefElement.tag,
    NavClassMenuElement.tag,
    NavTopMenuElement.tag,
    NavIsolateMenuElement.tag,
    NavRefreshElement.tag,
    NavNotifyElement.tag,
    ScriptInsetElement.tag,
    SourceInsetElement.tag,
    ViewFooterElement.tag
  ]);

  RenderingScheduler<IsolateViewElement> _r;

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

  M.VM _vm;
  M.Isolate _isolate;
  M.EventRepository _events;
  M.NotificationRepository _notifications;
  M.IsolateRepository _isolates;
  M.ScriptRepository _scripts;
  M.FunctionRepository _functions;
  M.LibraryRepository _libraries;
  M.InstanceRepository _instances;
  M.EvalRepository _eval;
  M.Function _function;
  M.ScriptRef _rootScript;
  StreamSubscription _subscription;

  M.VMRef get vm => _vm;
  M.Isolate get isolate => _isolate;
  M.NotificationRepository get notifications => _notifications;

  factory IsolateViewElement(
      M.VM vm,
      M.Isolate isolate,
      M.EventRepository events,
      M.NotificationRepository notifications,
      M.IsolateRepository isolates,
      M.ScriptRepository scripts,
      M.FunctionRepository functions,
      M.LibraryRepository libraries,
      M.InstanceRepository instances,
      M.EvalRepository eval,
      {RenderingQueue queue}) {
    assert(vm != null);
    assert(isolate != null);
    assert(events != null);
    assert(notifications != null);
    assert(isolates != null);
    assert(scripts != null);
    assert(functions != null);
    assert(instances != null);
    assert(eval != null);
    assert(libraries != null);
    IsolateViewElement e = document.createElement(tag.name);
    e._r = new RenderingScheduler(e, queue: queue);
    e._vm = vm;
    e._isolate = isolate;
    e._events = events;
    e._notifications = notifications;
    e._isolates = isolates;
    e._scripts = scripts;
    e._functions = functions;
    e._instances = instances;
    e._eval = eval;
    e._libraries = libraries;
    return e;
  }

  IsolateViewElement.created() : super.created();

  @override
  attached() {
    super.attached();
    _r.enable();
    _loadExtraData();
    _subscription = _events.onIsolateUpdate.listen((e) {
      if (e.isolate.id == _isolate) {
        _isolate = isolate;
        _r.dirty();
      }
    });
  }

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

  void render() {
    final uptime = new DateTime.now().difference(_isolate.startTime);
    final libraries = _isolate.libraries.toList();
    final List<Thread> threads = _isolate.threads;
    children = [
      navBar([
        new NavTopMenuElement(queue: _r.queue),
        new NavVMMenuElement(_vm, _events, queue: _r.queue),
        new NavIsolateMenuElement(_isolate, _events, queue: _r.queue),
        new NavRefreshElement(label: 'Reload Source', queue: _r.queue)
          ..onRefresh.listen((e) async {
            e.element.disabled = true;
            await _isolates.reloadSources(_isolate);
            _r.dirty();
          }),
        new NavRefreshElement(queue: _r.queue)
          ..onRefresh.listen((e) async {
            e.element.disabled = true;
            _isolate = await _isolates.get(_isolate);
            await _loadExtraData();
            _r.dirty();
          }),
        new NavNotifyElement(_notifications, queue: _r.queue)
      ]),
      new DivElement()
        ..classes = ['content-centered-big']
        ..children = [
          new HeadingElement.h2()..text = 'Isolate ${_isolate.name}',
          new BRElement(),
          new DivElement()
            ..classes = ['flex-row']
            ..children = [
              new DivElement()..style.flex = '1',
              new DivElement()
                ..children = [
                  new IsolateRunStateElement(_isolate, _events,
                      queue: _r.queue),
                  new IsolateLocationElement(_isolate, _events, _scripts,
                      queue: _r.queue),
                  new SpanElement()..text = ' [',
                  new AnchorElement(href: Uris.debugger(_isolate))
                    ..text = 'debug',
                  new SpanElement()..text = ']'
                ]
            ],
          new DivElement()
            ..children = _function != null
                ? [
                    new BRElement(),
                    new SourceInsetElement(_isolate, _function.location,
                        _scripts, _instances, _events,
                        currentPos:
                            M.topFrame(isolate.pauseEvent).location.tokenPos,
                        queue: _r.queue)..classes = ['header_inset']
                  ]
                : const [],
          new HRElement(),
          new IsolateSharedSummaryElement(_isolate, _events, queue: _r.queue),
          new HRElement(),
          new DivElement()
            ..classes = ['memberList']
            ..children = [
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'started at',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..text = '${_isolate.startTime}'
                ],
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'uptime',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..text = '$uptime'
                ],
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'root library',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..children = [
                      _isolate.rootLibrary == null
                          ? (new SpanElement()..text = 'loading...')
                          : new LibraryRefElement(
                              _isolate, _isolate.rootLibrary,
                              queue: _r.queue)
                    ]
                ],
              new DivElement()
                ..classes = ['memberItem']
                ..children = _isolate.entry != null
                    ? [
                        new DivElement()
                          ..classes = ['memberName']
                          ..text = 'entry',
                        new DivElement()
                          ..classes = ['memberValue']
                          ..children = [
                            new FunctionRefElement(_isolate, _isolate.entry,
                                queue: _r.queue)
                          ]
                      ]
                    : const [],
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'isolate id',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..text = '${_isolate.number}'
                ],
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'service protocol extensions',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..text = '${_isolate.extensionRPCs}'
                ],
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'allocated zone handle count',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..text = '${_isolate.numZoneHandles}'
                ],
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'allocated scoped handle count',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..text = '${_isolate.numScopedHandles}'
                ],
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'object store',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..children = [
                      new AnchorElement(href: Uris.objectStore(_isolate))
                        ..text = 'object store'
                    ]
                ],
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'native memory usage high watermark'
                    ..title = '''The maximum amount of native memory allocated
                    by the isolate over it\'s life.''',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..text = Utils.formatSize(_isolate.memoryHighWatermark)
                    ..title = '${_isolate.memoryHighWatermark}B'
                ],
              new BRElement(),
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'libraries (${libraries.length})',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..children = [
                      new CurlyBlockElement(queue: _r.queue)
                        ..content = libraries
                            .map((l) => new DivElement()
                              ..children = [
                                new LibraryRefElement(_isolate, l,
                                    queue: _r.queue)
                              ])
                            .toList()
                    ]
                ],
              new DivElement()
                ..classes = ['memberItem']
                ..children = [
                  new DivElement()
                    ..classes = ['memberName']
                    ..text = 'threads (${threads.length})',
                  new DivElement()
                    ..classes = ['memberValue']
                    ..children = [
                      new CurlyBlockElement(queue: _r.queue)
                        ..content = threads
                          .map(_populateThreadInfo)
                    ]
                ]
            ],
          new HRElement(),
          new EvalBoxElement(_isolate, _isolate.rootLibrary, _instances, _eval,
              queue: _r.queue),
          new DivElement()
            ..children = _rootScript != null
                ? [
                    new HRElement(),
                    new ScriptInsetElement(
                        _isolate, _rootScript, _scripts, _instances, _events,
                        queue: _r.queue)
                  ]
                : const [],
          new HRElement(),
          new ViewFooterElement(queue: _r.queue)
        ]
    ];
  }

  DivElement _populateThreadInfo(Thread t) {
    int index = 0;
    return new DivElement()
      ..classes = ['indent']
      ..children = [
        new SpanElement()
          ..text = '${t.id} ',
        new CurlyBlockElement(queue: _r.queue)
          ..content = [
            new DivElement()
              ..classes = ['indent']
              ..text = 'kind ${t.kindString}',
            new DivElement()
              ..classes = ['indent']
              ..title = '${t.memoryHighWatermark}B'
              ..text =
              'native memory usage high watermark ${Utils.formatSize(t.memoryHighWatermark)}',
            new DivElement()
              ..children = t.zones
                .map((z) => new DivElement()
                ..classes = ['indent']
                ..children = [
                  new DivElement()
                    ..children = [
                      new SpanElement()
                        ..children = [
                          new SpanElement()
                            ..text = 'zone ${index++} ',
                          new CurlyBlockElement(queue: _r.queue)
                            ..content = [
                              new DivElement()
                                ..classes = ['memberList']
                                ..children = [
                                  new DivElement()
                                    ..classes = ['memberItem']
                                    ..children = [
                                      new SpanElement()
                                        ..classes = ['memberName']
                                        ..text = 'used ',
                                      new SpanElement()
                                        ..classes = ['memberValue']
                                        ..title = '${z.used}B'
                                        ..text =
                                        Utils.formatSize(z.used)
                                    ],
                                  new DivElement()
                                    ..classes = ['memberItem']
                                    ..children = [
                                        new SpanElement()
                                          ..classes = ['memberName']
                                          ..text = 'capacity',
                                        new SpanElement()
                                          ..classes = ['memberValue']
                                          ..title = '${z.capacity}B'
                                          ..text =
                                          Utils.formatSize(z.capacity)
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
          )]
      ];
  }

  Future _loadExtraData() async {
    _function = null;
    _rootScript = null;
    final frame = M.topFrame(_isolate.pauseEvent);
    if (frame != null) {
      _function = await _functions.get(_isolate, frame.function.id);
    }
    if (_isolate.rootLibrary != null) {
      final rootLibrary =
          await _libraries.get(_isolate, _isolate.rootLibrary.id);
      _rootScript = rootLibrary.rootScript;
    }
    _r.dirty();
  }
}
