// Copyright 2018 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_GARCON_SERVICE_IMPL_H_
#define VM_TOOLS_GARCON_SERVICE_IMPL_H_

#include <base/macros.h>
#include <base/task_runner.h>
#include <grpcpp/grpcpp.h>
#include <vm_protos/proto_bindings/container_guest.grpc.pb.h>

#include "vm_tools/garcon/ansible_playbook_application.h"
#include "vm_tools/garcon/host_notifier.h"

namespace vm_tools {
namespace garcon {

class AnsiblePlaybookApplication;
class PackageKitProxy;

// Actually implements the garcon service.
class ServiceImpl final : public vm_tools::container::Garcon::Service {
 public:
  explicit ServiceImpl(PackageKitProxy* package_kit_proxy,
                       base::TaskRunner* task_runner,
                       HostNotifier* host_notifier);
  ~ServiceImpl() override = default;

  // Garcon::Service overrides.
  grpc::Status LaunchApplication(
      grpc::ServerContext* ctx,
      const vm_tools::container::LaunchApplicationRequest* request,
      vm_tools::container::LaunchApplicationResponse* response) override;

  grpc::Status GetIcon(grpc::ServerContext* ctx,
                       const vm_tools::container::IconRequest* request,
                       vm_tools::container::IconResponse* response) override;

  grpc::Status LaunchVshd(
      grpc::ServerContext* ctx,
      const vm_tools::container::LaunchVshdRequest* request,
      vm_tools::container::LaunchVshdResponse* response) override;

  grpc::Status GetLinuxPackageInfo(
      grpc::ServerContext* ctx,
      const vm_tools::container::LinuxPackageInfoRequest* request,
      vm_tools::container::LinuxPackageInfoResponse* response) override;

  grpc::Status InstallLinuxPackage(
      grpc::ServerContext* ctx,
      const vm_tools::container::InstallLinuxPackageRequest* request,
      vm_tools::container::InstallLinuxPackageResponse* response) override;

  grpc::Status UninstallPackageOwningFile(
      grpc::ServerContext* ctx,
      const vm_tools::container::UninstallPackageOwningFileRequest* request,
      vm_tools::container::UninstallPackageOwningFileResponse* response)
      override;

  grpc::Status GetDebugInformation(
      grpc::ServerContext* ctx,
      const vm_tools::container::GetDebugInformationRequest* request,
      vm_tools::container::GetDebugInformationResponse* response) override;

  grpc::Status ConnectChunnel(
      grpc::ServerContext* ctx,
      const vm_tools::container::ConnectChunnelRequest* request,
      vm_tools::container::ConnectChunnelResponse* response) override;

  grpc::Status ApplyAnsiblePlaybook(
      grpc::ServerContext* ctx,
      const vm_tools::container::ApplyAnsiblePlaybookRequest* request,
      vm_tools::container::ApplyAnsiblePlaybookResponse* response) override;

  grpc::Status ConfigureForArcSideload(
      grpc::ServerContext* ctx,
      const vm_tools::container::ConfigureForArcSideloadRequest* request,
      vm_tools::container::ConfigureForArcSideloadResponse* response) override;

  grpc::Status AddFileWatch(
      grpc::ServerContext* ctx,
      const vm_tools::container::AddFileWatchRequest* request,
      vm_tools::container::AddFileWatchResponse* response) override;

  grpc::Status RemoveFileWatch(
      grpc::ServerContext* ctx,
      const vm_tools::container::RemoveFileWatchRequest* request,
      vm_tools::container::RemoveFileWatchResponse* response) override;

 private:
  PackageKitProxy* package_kit_proxy_;  // Not owned.
  base::TaskRunner* task_runner_;
  HostNotifier* host_notifier_;

  DISALLOW_COPY_AND_ASSIGN(ServiceImpl);
};

}  // namespace garcon
}  // namespace vm_tools

#endif  // VM_TOOLS_GARCON_SERVICE_IMPL_H_
