// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef VM_TOOLS_CICERONE_CRASH_LISTENER_IMPL_H_
#define VM_TOOLS_CICERONE_CRASH_LISTENER_IMPL_H_

#include <string>

#include <base/memory/weak_ptr.h>
#include <base/optional.h>
#include <base/sequenced_task_runner.h>
#include <base/synchronization/waitable_event.h>
#include <grpcpp/grpcpp.h>
#include <vm_protos/proto_bindings/vm_crash.grpc.pb.h>

#include "metrics/metrics_library.h"

namespace vm_tools {
namespace cicerone {

class Service;
class VirtualMachine;

class CrashListenerImpl final : public CrashListener::Service {
 public:
  explicit CrashListenerImpl(
      base::WeakPtr<vm_tools::cicerone::Service> service);
  CrashListenerImpl(const CrashListenerImpl&) = delete;
  CrashListenerImpl& operator=(const CrashListenerImpl&) = delete;
  ~CrashListenerImpl() override = default;

  grpc::Status CheckMetricsConsent(grpc::ServerContext* ctx,
                                   const EmptyMessage* request,
                                   MetricsConsentResponse* response) override;

  grpc::Status SendCrashReport(grpc::ServerContext* ctx,
                               const CrashReport* crash_report,
                               EmptyMessage* response) override;

  grpc::Status SendFailureReport(grpc::ServerContext* ctx,
                                 const FailureReport* failure_report,
                                 EmptyMessage* response) override;

 private:
  base::Optional<pid_t> GetPidFromPeerAddress(grpc::ServerContext* ctx);

  void GetVirtualMachineForCidOrToken(const uint32_t cid,
                                      VirtualMachine** vm_out,
                                      std::string* owner_id_out,
                                      std::string* name_out,
                                      bool* ret_value,
                                      base::WaitableEvent* event);

  bool ShouldRecordFailures(grpc::ServerContext* ctx);

  void GetVmStoppingOnDBusThread(const uint32_t cid,
                                 bool* is_stopping_or_stopped,
                                 base::WaitableEvent* event);

  MetricsLibrary metrics_{};

  base::WeakPtr<vm_tools::cicerone::Service> service_;  // not owned
  // Task runner for the DBus thread; requests to perform DBus operations
  // on |service_| generally need to be posted to this thread.
  scoped_refptr<base::SequencedTaskRunner> task_runner_;
};

}  // namespace cicerone
}  // namespace vm_tools

#endif  // VM_TOOLS_CICERONE_CRASH_LISTENER_IMPL_H_
