// 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 vm_view_element;

import 'dart:async';
import 'dart:html';
import 'package:observatory_2/models.dart' as M;
import 'package:observatory_2/src/elements/helpers/nav_bar.dart';
import 'package:observatory_2/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory_2/src/elements/helpers/custom_element.dart';
import 'package:observatory_2/src/elements/helpers/uris.dart';
import 'package:observatory_2/src/elements/isolate/summary.dart';
import 'package:observatory_2/src/elements/nav/notify.dart';
import 'package:observatory_2/src/elements/nav/refresh.dart';
import 'package:observatory_2/src/elements/nav/top_menu.dart';
import 'package:observatory_2/src/elements/nav/vm_menu.dart';
import 'package:observatory_2/utils.dart';

class VMViewElement extends CustomElement implements Renderable {
  RenderingScheduler<VMViewElement> _r;

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

  M.VM _vm;
  M.VMRepository _vms;
  M.EventRepository _events;
  M.NotificationRepository _notifications;
  M.IsolateRepository _isolates;
  M.IsolateGroupRepository _isolateGroups;
  M.ScriptRepository _scripts;
  StreamSubscription _vmSubscription;
  StreamSubscription _startSubscription;
  StreamSubscription _exitSubscription;

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

  factory VMViewElement(
      M.VM vm,
      M.VMRepository vms,
      M.EventRepository events,
      M.NotificationRepository notifications,
      M.IsolateRepository isolates,
      M.IsolateGroupRepository isolateGroups,
      M.ScriptRepository scripts,
      {RenderingQueue queue}) {
    assert(vm != null);
    assert(vms != null);
    assert(events != null);
    assert(notifications != null);
    assert(isolates != null);
    assert(scripts != null);
    VMViewElement e = new VMViewElement.created();
    e._r = new RenderingScheduler<VMViewElement>(e, queue: queue);
    e._vm = vm;
    e._vms = vms;
    e._events = events;
    e._notifications = notifications;
    e._isolates = isolates;
    e._isolateGroups = isolateGroups;
    e._scripts = scripts;
    return e;
  }

  VMViewElement.created() : super.created('vm-view');

  @override
  attached() {
    super.attached();
    _r.enable();
    _vmSubscription = _events.onVMUpdate.listen((e) {
      _vm = e.vm;
      _r.dirty();
    });
    _startSubscription = _events.onIsolateStart.listen((_) => _r.dirty());
    _exitSubscription = _events.onIsolateExit.listen((_) => _r.dirty());
    _loadExtraData();
  }

  @override
  detached() {
    super.detached();
    _r.disable(notify: true);
    children = <Element>[];
    _vmSubscription.cancel();
    _startSubscription.cancel();
    _exitSubscription.cancel();
  }

  Future _loadExtraData() async {
    for (var group in _vm.isolateGroups) {
      await _isolateGroups.get(group);
    }
    for (var group in _vm.systemIsolateGroups) {
      await _isolateGroups.get(group);
    }
    _r.dirty();
  }

  void render() {
    children = <Element>[
      navBar(<Element>[
        new NavTopMenuElement(queue: _r.queue).element,
        new NavVMMenuElement(_vm, _events, queue: _r.queue).element,
        (new NavRefreshElement(queue: _r.queue)
              ..onRefresh.listen((e) async {
                e.element.disabled = true;
                _vm = await _vms.get(_vm);
                _loadExtraData();
                _r.dirty();
              }))
            .element,
        new NavNotifyElement(_notifications, queue: _r.queue).element
      ]),
      describeProcess(),
      describeVM(),
      describeIsolateGroups(),
      describeSystemIsolateGroups(),
    ];
  }

  Element describeProcess() {
    return new DivElement()
      ..classes = ['content-centered-big']
      ..children = <HtmlElement>[
        new HeadingElement.h1()..text = 'Process',
        new DivElement()
          ..classes = ['memberList']
          ..children = <Element>[
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'pid',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = '${_vm.pid}'
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'current memory'
                  ..title =
                      'current value of the resident set size of the process running this VM',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = _vm.currentRSS != null
                      ? Utils.formatSize(_vm.currentRSS)
                      : "unavailable"
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'peak memory'
                  ..title =
                      'highest value of the resident set size of the process running this VM',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = _vm.maxRSS != null
                      ? Utils.formatSize(_vm.maxRSS)
                      : "unavailable"
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'malloc used memory',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = _vm.mallocUsed != null
                      ? Utils.formatSize(_vm.mallocUsed)
                      : 'unavailable'
                  ..title =
                      _vm.mallocUsed != null ? '${_vm.mallocUsed} bytes' : null
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'malloc capacity memory',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = _vm.mallocCapacity != null
                      ? Utils.formatSize(_vm.mallocCapacity)
                      : 'unavailable'
                  ..title = _vm.mallocCapacity != null
                      ? '${_vm.mallocCapacity} bytes'
                      : null
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'malloc implementation',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = _vm.mallocImplementation
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..children = <Element>[
                    new SpanElement()..text = 'view ',
                    new AnchorElement(href: Uris.nativeMemory())
                      ..text = 'malloc profile'
                  ],
                new DivElement()
                  ..classes = ['memberName']
                  ..children = <Element>[
                    new SpanElement()..text = 'view ',
                    new AnchorElement(href: Uris.processSnapshot())
                      ..text = 'process memory'
                  ]
              ]
          ],
        new BRElement(),
      ];
  }

  Element describeVM() {
    final uptime = new DateTime.now().difference(_vm.startTime);
    return new DivElement()
      ..classes = ['content-centered-big']
      ..children = <HtmlElement>[
        new HeadingElement.h1()..text = 'VM',
        new DivElement()
          ..classes = ['memberList']
          ..children = <Element>[
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'name',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = _vm.displayName
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'version',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = _vm.version
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'embedder',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = _vm.embedder ?? "UNKNOWN"
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'current memory'
                  ..title = 'current amount of memory consumed by the Dart VM',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = _vm.currentMemory != null
                      ? Utils.formatSize(_vm.currentMemory)
                      : "unavailable"
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'started at',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = '${_vm.startTime}'
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'uptime',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = '$uptime'
              ],
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..text = 'refreshed at',
                new DivElement()
                  ..classes = ['memberValue']
                  ..text = '${new DateTime.now()}'
              ],
            new BRElement(),
            new DivElement()
              ..classes = ['memberItem']
              ..children = <Element>[
                new DivElement()
                  ..classes = ['memberName']
                  ..children = <Element>[
                    new SpanElement()..text = 'see ',
                    new AnchorElement(href: Uris.flags())..text = 'flags'
                  ],
                new DivElement()
                  ..classes = ['memberValue']
                  ..children = <Element>[
                    new SpanElement()..text = 'view ',
                    new AnchorElement(href: Uris.timeline())..text = 'timeline'
                  ]
              ],
          ],
        new BRElement(),
      ];
  }

  Element describeIsolateGroups() {
    final isolateGroups = _vm.isolateGroups.toList();
    return new DivElement()
      ..children = isolateGroups.map(describeIsolateGroup).toList();
  }

  Element describeSystemIsolateGroups() {
    final isolateGroups = _vm.systemIsolateGroups.toList();
    return new DivElement()
      ..children = isolateGroups.map(describeIsolateGroup).toList();
  }

  Element describeIsolateGroup(M.IsolateGroupRef group) {
    final isolateType =
        group.isSystemIsolateGroup ? 'System Isolate' : 'Isolate';
    final isolates = (group as M.IsolateGroup).isolates;
    return new DivElement()
      ..classes = ['content-centered-big']
      ..children = <Element>[
        new HRElement(),
        new HeadingElement.h1()
          ..text = "$isolateType Group ${group.number} (${group.name})",
        new LIElement()
          ..classes = ['list-group-item']
          ..children = <Element>[
            new UListElement()
              ..classes = ['list-group']
              ..children = isolates.map(describeIsolate).toList(),
          ],
      ];
  }

  Element describeIsolate(M.IsolateRef isolate) {
    return new LIElement()
      ..classes = ['list-group-item']
      ..children = <Element>[
        new IsolateSummaryElement(isolate, _isolates, _events, _scripts,
                queue: _r.queue)
            .element
      ];
  }
}
