/*
 * Copyright 2017 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
package io.flutter.view;

import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.util.messages.MessageBus;
import com.intellij.util.messages.Topic;
import io.flutter.run.daemon.FlutterApp;
import io.flutter.vmService.VMServiceManager;
import org.dartlang.vm.service.VmService;
import org.jetbrains.annotations.NotNull;

/**
 * Coordinates communication on the message bus.
 */
public class FlutterViewMessages {
  public static final Topic<FlutterDebugNotifier> FLUTTER_DEBUG_TOPIC = Topic.create("flutter.debugActive", FlutterDebugNotifier.class);

  public interface FlutterDebugNotifier {
    void debugActive(FlutterDebugEvent event);
  }

  public static class FlutterDebugEvent {
    public final @NotNull FlutterApp app;
    public final @NotNull VmService vmService;

    FlutterDebugEvent(@NotNull FlutterApp app,
                      @NotNull VmService vmService) {
      this.app = app;
      this.vmService = vmService;
    }
  }

  public static void sendDebugActive(@NotNull Project project,
                                     @NotNull FlutterApp app,
                                     @NotNull VmService vmService) {
    final MessageBus bus = project.getMessageBus();
    final FlutterDebugNotifier publisher = bus.syncPublisher(FLUTTER_DEBUG_TOPIC);

    assert (app.getFlutterDebugProcess() != null);

    final VMServiceManager vmServiceManager = new VMServiceManager(app, vmService);
    Disposer.register(app.getFlutterDebugProcess().getVmServiceWrapper(), vmServiceManager);
    app.setVmServices(vmService, vmServiceManager);
    publisher.debugActive(new FlutterDebugEvent(app, vmService));

    // TODO(pq): consider pushing into perf service.
    app.getFlutterLog().listenToVm(vmService);
  }
}