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

#ifndef COMPONENTS_ENTERPRISE_BROWSER_REPORTING_REPORT_REQUEST_H_
#define COMPONENTS_ENTERPRISE_BROWSER_REPORTING_REPORT_REQUEST_H_

#include <memory>
#include <queue>
#include <variant>

#include "build/build_config.h"
#include "device_management_backend.pb.h"

namespace enterprise_reporting {

enum class ReportType;

// A class is used to allow reports of multiple types to be stored in a single
// queue for the uploader.
class ReportRequest {
 public:
#if BUILDFLAG(IS_CHROMEOS)
  using DeviceReportRequestProto =
      enterprise_management::ChromeOsUserReportRequest;
#else
  using DeviceReportRequestProto =
      enterprise_management::ChromeDesktopReportRequest;
#endif

  explicit ReportRequest(ReportType type);
  explicit ReportRequest(
      const enterprise_management::ChromeDesktopReportRequest& proto);
  explicit ReportRequest(
      const enterprise_management::ChromeOsUserReportRequest& proto);
  explicit ReportRequest(
      const enterprise_management::ChromeProfileReportRequest& proto);

  ReportRequest(const ReportRequest&) = delete;
  ReportRequest& operator=(const ReportRequest&) = delete;
  ~ReportRequest();

  const DeviceReportRequestProto& GetDeviceReportRequest() const;
  DeviceReportRequestProto& GetDeviceReportRequest();

  const enterprise_management::ChromeProfileReportRequest&
  GetChromeProfileReportRequest() const;
  enterprise_management::ChromeProfileReportRequest&
  GetChromeProfileReportRequest();

  // Clone the request proto.
  // This is required when a report is splitted into multiple requests.
  // As all requests need to contain shared information like browser version or
  // machine name. Long term, we can improves the splitting algorithm so Clone
  // is no longer necessary.
  std::unique_ptr<ReportRequest> Clone() const;

 private:
  std::variant<enterprise_management::ChromeDesktopReportRequest,
               enterprise_management::ChromeOsUserReportRequest,
               enterprise_management::ChromeProfileReportRequest>
      proto_;
};

using ReportRequestQueue = std::queue<std::unique_ptr<ReportRequest>>;

}  // namespace enterprise_reporting

#endif  // COMPONENTS_ENTERPRISE_BROWSER_REPORTING_REPORT_REQUEST_H_
