// 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 'package:logging/logging.dart';
import 'package:observatory/models.dart' as M;
import 'package:observatory/service.dart' as S;

class VMUpdateEvent implements M.VMUpdateEvent {
  final DateTime timestamp;
  final M.VMRef vm;
  VMUpdateEvent(this.timestamp, this.vm) {
    assert(timestamp != null);
    assert(vm != null);
  }
}

class IsolateStartEvent implements M.IsolateStartEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  IsolateStartEvent(this.timestamp, this.isolate) {
    assert(timestamp != null);
    assert(isolate != null);
  }
}

class IsolateRunnableEvent implements M.IsolateRunnableEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  IsolateRunnableEvent(this.timestamp, this.isolate) {
    assert(timestamp != null);
    assert(isolate != null);
  }
}

class IsolateExitEvent implements M.IsolateExitEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  IsolateExitEvent(this.timestamp, this.isolate) {
    assert(timestamp != null);
    assert(isolate != null);
  }
}

class IsolateUpdateEvent implements M.IsolateUpdateEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  IsolateUpdateEvent(this.timestamp, this.isolate) {
    assert(timestamp != null);
    assert(isolate != null);
  }
}

class IsolateReloadEvent implements M.IsolateReloadEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final M.ErrorRef error;
  IsolateReloadEvent(this.timestamp, this.isolate, this.error) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(error != null);
  }
}

class ServiceExtensionAddedEvent implements M.ServiceExtensionAddedEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final String extensionRPC;
  ServiceExtensionAddedEvent(this.timestamp, this.isolate, this.extensionRPC) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(extensionRPC != null);
  }
}

class DebuggerSettingsUpdateEvent implements M.DebuggerSettingsUpdateEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  DebuggerSettingsUpdateEvent(this.timestamp, this.isolate) {
    assert(timestamp != null);
    assert(isolate != null);
  }
}

class PauseStartEvent implements M.PauseStartEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  PauseStartEvent(this.timestamp, this.isolate) {
    assert(timestamp != null);
    assert(isolate != null);
  }
}

class PauseExitEvent implements M.PauseExitEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  PauseExitEvent(this.timestamp, this.isolate) {
    assert(timestamp != null);
    assert(isolate != null);
  }
}

class PauseBreakpointEvent implements M.PauseBreakpointEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final Iterable<M.Breakpoint> pauseBreakpoints;
  final M.Frame topFrame;
  final bool atAsyncSuspension;

  /// [optional]
  final M.Breakpoint breakpoint;
  PauseBreakpointEvent(
      this.timestamp,
      this.isolate,
      Iterable<M.Breakpoint> pauseBreakpoints,
      this.topFrame,
      this.atAsyncSuspension,
      [this.breakpoint])
      : pauseBreakpoints = new List.unmodifiable(pauseBreakpoints) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(pauseBreakpoints != null);
    assert(topFrame != null);
    assert(atAsyncSuspension != null);
  }
}

class PauseInterruptedEvent implements M.PauseInterruptedEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final M.Frame topFrame;
  final bool atAsyncSuspension;
  PauseInterruptedEvent(
      this.timestamp, this.isolate, this.topFrame, this.atAsyncSuspension) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(atAsyncSuspension != null);
  }
}

class PauseExceptionEvent implements M.PauseExceptionEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final M.Frame topFrame;
  final M.InstanceRef exception;
  PauseExceptionEvent(
      this.timestamp, this.isolate, this.topFrame, this.exception) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(topFrame != null);
    assert(exception != null);
  }
}

class ResumeEvent implements M.ResumeEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final M.Frame topFrame;
  ResumeEvent(this.timestamp, this.isolate, this.topFrame) {
    assert(timestamp != null);
    assert(isolate != null);
  }
}

class BreakpointAddedEvent implements M.BreakpointAddedEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final M.Breakpoint breakpoint;
  BreakpointAddedEvent(this.timestamp, this.isolate, this.breakpoint) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(breakpoint != null);
  }
}

class BreakpointResolvedEvent implements M.BreakpointResolvedEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final M.Breakpoint breakpoint;
  BreakpointResolvedEvent(this.timestamp, this.isolate, this.breakpoint) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(breakpoint != null);
  }
}

class BreakpointRemovedEvent implements M.BreakpointRemovedEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final M.Breakpoint breakpoint;
  BreakpointRemovedEvent(this.timestamp, this.isolate, this.breakpoint) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(breakpoint != null);
  }
}

class InspectEvent implements M.InspectEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final M.InstanceRef inspectee;
  InspectEvent(this.timestamp, this.isolate, this.inspectee) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(inspectee != null);
  }
}

class NoneEvent implements M.NoneEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  NoneEvent(this.timestamp, this.isolate) {
    assert(timestamp != null);
    assert(isolate != null);
  }
}

class GCEvent implements M.GCEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  GCEvent(this.timestamp, this.isolate) {
    assert(timestamp != null);
    assert(isolate != null);
  }
}

class LoggingEvent implements M.LoggingEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final Map logRecord;
  LoggingEvent(this.timestamp, this.isolate, this.logRecord) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(logRecord != null);
  }
}

class ExtensionEvent implements M.ExtensionEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final String extensionKind;
  final M.ExtensionData extensionData;
  ExtensionEvent(
      this.timestamp, this.isolate, this.extensionKind, this.extensionData) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(extensionKind != null);
    assert(extensionData != null);
  }
}

class TimelineEventsEvent implements M.TimelineEventsEvent {
  final DateTime timestamp;
  final M.IsolateRef isolate;
  final Iterable<M.TimelineEvent> timelineEvents;
  TimelineEventsEvent(
      this.timestamp, this.isolate, Iterable<M.TimelineEvent> timelineEvents)
      : timelineEvents = new List.unmodifiable(timelineEvents) {
    assert(timestamp != null);
    assert(isolate != null);
    assert(timelineEvents != null);
  }
}

class ConnectionClosedEvent implements M.ConnectionClosedEvent {
  final DateTime timestamp;
  final String reason;
  ConnectionClosedEvent(this.timestamp, this.reason) {
    assert(timestamp != null);
    assert(reason != null);
  }
}

M.Event createEventFromServiceEvent(S.ServiceEvent event) {
  switch (event.kind) {
    case S.ServiceEvent.kVMUpdate:
      return new VMUpdateEvent(event.timestamp, event.vm);
    case S.ServiceEvent.kIsolateStart:
      return new IsolateStartEvent(event.timestamp, event.isolate);
    case S.ServiceEvent.kIsolateRunnable:
      return new IsolateRunnableEvent(event.timestamp, event.isolate);
    case S.ServiceEvent.kIsolateUpdate:
      return new IsolateUpdateEvent(event.timestamp, event.isolate);
    case S.ServiceEvent.kIsolateReload:
      return new IsolateReloadEvent(
          event.timestamp, event.isolate, event.error);
    case S.ServiceEvent.kIsolateExit:
      return new IsolateExitEvent(event.timestamp, event.isolate);
    case S.ServiceEvent.kBreakpointAdded:
      return new BreakpointAddedEvent(
          event.timestamp, event.isolate, event.breakpoint);
    case S.ServiceEvent.kBreakpointResolved:
      return new BreakpointResolvedEvent(
          event.timestamp, event.isolate, event.breakpoint);
    case S.ServiceEvent.kBreakpointRemoved:
      return new BreakpointRemovedEvent(
          event.timestamp, event.isolate, event.breakpoint);
    case S.ServiceEvent.kDebuggerSettingsUpdate:
      return new DebuggerSettingsUpdateEvent(event.timestamp, event.isolate);
    case S.ServiceEvent.kResume:
      return new ResumeEvent(event.timestamp, event.isolate, event.topFrame);
    case S.ServiceEvent.kPauseStart:
      return new PauseStartEvent(event.timestamp, event.isolate);
    case S.ServiceEvent.kPauseExit:
      return new PauseExitEvent(event.timestamp, event.isolate);
    case S.ServiceEvent.kPauseBreakpoint:
      return new PauseBreakpointEvent(
          event.timestamp,
          event.isolate,
          event.pauseBreakpoints,
          event.topFrame,
          event.atAsyncSuspension,
          event.breakpoint);
    case S.Isolate.kLoggingStream:
      return new LoggingEvent(event.timestamp, event.isolate, event.logRecord);
    case S.ServiceEvent.kPauseInterrupted:
      return new PauseInterruptedEvent(event.timestamp, event.isolate,
          event.topFrame, event.atAsyncSuspension);
    case S.ServiceEvent.kPauseException:
      return new PauseExceptionEvent(
          event.timestamp, event.isolate, event.topFrame, event.exception);
    case S.ServiceEvent.kInspect:
      return new InspectEvent(event.timestamp, event.isolate, event.inspectee);
    case S.ServiceEvent.kGC:
      return new GCEvent(event.timestamp, event.isolate);
    case S.ServiceEvent.kNone:
      return new NoneEvent(event.timestamp, event.isolate);
    default:
      // Ignore unrecognized events.
      Logger.root.severe('Unrecognized event: $event');
      return null;
  }
}
