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

import 'dart:html';

import 'package:logging/logging.dart';
import 'package:observatory/service.dart';
import 'package:polymer/polymer.dart';

import 'class_ref.dart';
import 'library_ref.dart';
import 'observatory_element.dart';

@CustomTag('service-ref')
class ServiceRefElement extends ObservatoryElement {
  @published ServiceObject ref;
  @published bool internal = false;
  @published String expandKey;
  ServiceRefElement.created() : super.created();

  void refChanged(oldValue) {
    notifyPropertyChange(#url, "", url);
    notifyPropertyChange(#name, [], name);
    notifyPropertyChange(#nameIsEmpty, 0, 1);
    notifyPropertyChange(#hoverText, "", hoverText);
  }

  String get url {
    if (ref == null) {
      return 'NULL REF';
    }
    return gotoLink('/inspect', ref);
  }

  String get serviceId {
    if (ref == null) {
      return 'NULL REF';
    }
    return ref.id;
  }

  String get hoverText {
    if (ref == null) {
      return 'NULL REF';
    }
    return ref.vmName;
  }

  String get name {
    if (ref == null) {
      return 'NULL REF';
    }
    return ref.name;
  }

  // Workaround isEmpty not being useable due to missing @MirrorsUsed.
  bool get nameIsEmpty {
    return (name == null) || name.isEmpty;
  }


  @published bool expanded = false;
  dynamic expander() {
    return expandEvent;
  }
  void expandEvent(bool expand, Function onDone) {
    if (expand) {
      ref.reload().then((result) {
        ref = result;
        notifyPropertyChange(#ref, 0, 1);
        expanded = true;
      }).whenComplete(onDone);
    } else {
      expanded = false;
      onDone();
    }
  }
}


@CustomTag('any-service-ref')
class AnyServiceRefElement extends ObservatoryElement {
  @published ServiceObject ref;
  @published String expandKey;
  @published bool asValue = false;
  AnyServiceRefElement.created() : super.created();

  Element _constructElementForRef() {
    var type = ref.type;
    switch (type) {
     case 'Class':
        ClassRefElement element = new Element.tag('class-ref');
        element.ref = ref;
        element.asValue = asValue;
        return element;
      case 'Code':
        ServiceRefElement element = new Element.tag('code-ref');
        element.ref = ref;
        return element;
      case 'Context':
        ServiceRefElement element = new Element.tag('context-ref');
        element.ref = ref;
        return element;
      case 'Error':
        ServiceRefElement element = new Element.tag('error-ref');
        element.ref = ref;
        return element;
      case 'Field':
        ServiceRefElement element = new Element.tag('field-ref');
        element.ref = ref;
        return element;
      case 'Function':
        ServiceRefElement element = new Element.tag('function-ref');
        element.ref = ref;
        return element;
      case 'Library':
        LibraryRefElement element = new Element.tag('library-ref');
        element.ref = ref;
        element.asValue = asValue;
        return element;
      case 'Object':
        ServiceRefElement element = new Element.tag('object-ref');
        element.ref = ref;
        return element;
      case 'Script':
        ServiceRefElement element = new Element.tag('script-ref');
        element.ref = ref;
        return element;
      case 'Instance':
      case 'Sentinel':
        ServiceRefElement element = new Element.tag('instance-ref');
        element.ref = ref;
        if (expandKey != null) {
          element.expandKey = expandKey;
        }
        return element;
      default:
        SpanElement element = new Element.tag('span');
        element.text = "<<Unknown service ref: $ref>>";
        return element;
    }
  }

  refChanged(oldValue) {
    // Remove the current view.
    children.clear();
    if (ref == null) {
      Logger.root.info('Viewing null object.');
      return;
    }
    var type = ref.type;
    var element = _constructElementForRef();
    if (element == null) {
      Logger.root.info('Unable to find a ref element for \'${type}\'');
      return;
    }
    children.add(element);
  }
}

@CustomTag('object-ref')
class ObjectRefElement extends ServiceRefElement {
  ObjectRefElement.created() : super.created();
}
