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

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

@CustomTag('service-view')
class ServiceObjectViewElement extends ObservatoryElement {
  @published ServiceObject object;
  @published ObservableMap args;

  ServiceObjectViewElement.created() : super.created();

  ObservatoryElement _constructElementForObject() {
    var type = object.serviceType;
    switch (type) {
      case 'AllocationProfile':
        HeapProfileElement element = new Element.tag('heap-profile');
        element.profile = object;
        return element;
      case 'BreakpointList':
        BreakpointListElement element = new Element.tag('breakpoint-list');
        element.msg = object;
        return element;
      case 'Class':
        ClassViewElement element = new Element.tag('class-view');
        element.cls = object;
        return element;
      case 'Code':
        CodeViewElement element = new Element.tag('code-view');
        element.code = object;
        return element;
      case 'Error':
        ErrorViewElement element = new Element.tag('error-view');
        element.error = object;
        return element;
      case 'Field':
        FieldViewElement element = new Element.tag('field-view');
        element.field = object;
        return element;
      case 'FlagList':
        FlagListElement element = new Element.tag('flag-list');
        element.flagList = object;
        return element;
      case 'Function':
        FunctionViewElement element = new Element.tag('function-view');
        element.function = object;
        return element;
      case 'HeapMap':
        HeapMapElement element = new Element.tag('heap-map');
        element.fragmentation = object;
        return element;
      case 'LibraryPrefix':
      case 'TypeRef':
      case 'TypeParameter':
      case 'BoundedType':
      case 'Int32x4':
      case 'Float32x4':
      case 'Float64x4':
      case 'TypedData':
      case 'ExternalTypedData':
      case 'Capability':
      case 'ReceivePort':
      case 'SendPort':
      case 'Stacktrace':
      case 'JSRegExp':
      case 'WeakProperty':
      case 'MirrorReference':
      case 'UserTag':
        // TODO(turnidge): The types above this comment are instance
        // types and should be handled by the InstanceViewElement.  We
        // need to go through these and make sure that they print in a
        // reasonable way.
      case 'Type':
      case 'Array':
      case 'Bool':
      case 'Closure':
      case 'Double':
      case 'GrowableObjectArray':
      case 'Instance':
      case 'Smi':
      case 'Mint':
      case 'Bigint':
      case 'String':
        InstanceViewElement element = new Element.tag('instance-view');
        element.instance = object;
        return element;
      case 'IO':
        IOViewElement element = new Element.tag('io-view');
        element.io = object;
        return element;
      case 'HttpServerList':
        IOHttpServerListViewElement element =
            new Element.tag('io-http-server-list-view');
        element.list = object;
        return element;
      case 'HttpServer':
        IOHttpServerViewElement element =
            new Element.tag('io-http-server-view');
        element.httpServer = object;
        return element;
      case 'HttpServerConnection':
        IOHttpServerConnectionViewElement element =
            new Element.tag('io-http-server-connection-view');
        element.connection = object;
        return element;
      case 'SocketList':
        IOSocketListViewElement element =
            new Element.tag('io-socket-list-view');
        element.list = object;
        return element;
      case 'Socket':
        IOSocketViewElement element = new Element.tag('io-socket-view');
        element.socket = object;
        return element;
      case 'WebSocketList':
        IOWebSocketListViewElement element =
            new Element.tag('io-web-socket-list-view');
        element.list = object;
        return element;
      case 'WebSocket':
        IOWebSocketViewElement element = new Element.tag('io-web-socket-view');
        element.webSocket = object;
        return element;
      case 'Isolate':
        IsolateViewElement element = new Element.tag('isolate-view');
        element.isolate = object;
        return element;
      case 'Library':
        LibraryViewElement element = new Element.tag('library-view');
        element.library = object;
        return element;
      case 'ProcessList':
        IOProcessListViewElement element =
            new Element.tag('io-process-list-view');
        element.list = object;
        return element;
      case 'Process':
        IOProcessViewElement element = new Element.tag('io-process-view');
        element.process = object;
        return element;
      case 'Profile':
        IsolateProfileElement element = new Element.tag('isolate-profile');
        element.profile = object;
        return element;
      case 'RandomAccessFileList':
        IORandomAccessFileListViewElement element =
            new Element.tag('io-random-access-file-list-view');
        element.list = object;
        return element;
      case 'RandomAccessFile':
        IORandomAccessFileViewElement element =
            new Element.tag('io-random-access-file-view');
        element.file = object;
        return element;
      case 'ServiceError':
        ServiceErrorViewElement element =
            new Element.tag('service-error-view');
        element.error = object;
        return element;
      case 'ServiceException':
        ServiceExceptionViewElement element =
                    new Element.tag('service-exception-view');
        element.exception = object;
        return element;
      case 'Script':
        ScriptViewElement element = new Element.tag('script-view');
        element.script = object;
        return element;
      case 'StackTrace':
        StackTraceElement element = new Element.tag('stack-trace');
        element.trace = object;
        return element;
      case 'VM':
        VMViewElement element = new Element.tag('vm-view');
        element.vm = object;
        return element;
      default:
        JsonViewElement element = new Element.tag('json-view');
        element.map = object;
        return element;
    }
  }

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