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

#ifndef CHROME_BROWSER_UI_VIEWS_MEDIA_PREVIEW_MEDIA_PREVIEW_METRICS_H_
#define CHROME_BROWSER_UI_VIEWS_MEDIA_PREVIEW_MEDIA_PREVIEW_METRICS_H_

#include "base/time/time.h"
#include "media/capture/video_capture_types.h"

namespace media_preview_metrics {

enum class UiLocation { kPermissionPrompt, kPageInfo };
enum class PreviewType { kCamera, kMic, kCameraAndMic };

struct Context {
  Context(UiLocation ui_location, PreviewType preview_type);
  ~Context();

  // This class is move- and copy-constructible:
  Context(const Context& other);
  Context(Context&& other);

  Context& operator=(const Context& other) = delete;
  Context& operator=(Context&& other) = delete;

  const UiLocation ui_location;
  const PreviewType preview_type;
};

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class MediaPreviewDeviceSelectionUserAction {
  kNoAction = 0,
  kOpened = 1,
  kSelection = 2,
  // Add new types only immediately above this line. Remember to also update
  // tools/metrics/histograms/metadata/media/enums.xml.
  kMaxValue = kSelection,
};

void RecordPageInfoNumInUseDevices(const Context& context, int devices);
void RecordMediaPreviewDuration(const Context& context,
                                const base::TimeDelta& delta);

void RecordDeviceSelectionTotalDevices(const Context& context, int devices);
void RecordDeviceSelectionAction(
    const Context& context,
    MediaPreviewDeviceSelectionUserAction user_action);

void RecordPreviewCameraPixelHeight(const Context& context, int pixel_height);
void RecordPreviewVideoExpectedFPS(const Context& context, int expected_fps);
void RecordPreviewVideoActualFPS(const Context& context, int actual_fps);
void RecordPreviewVideoFramesRenderedPercent(const Context& context,
                                             float percent);
void RecordTotalVisiblePreviewDuration(const Context& context,
                                       const base::TimeDelta& delta);
void RecordTimeToActionWithoutPreview(const Context& context,
                                      const base::TimeDelta& delta);
void RecordPreviewDelayTime(const Context& context,
                            const base::TimeDelta& delta);

void RecordVideoCaptureError(const Context& context,
                             media::VideoCaptureError received_error);

}  // namespace media_preview_metrics

#endif  // CHROME_BROWSER_UI_VIEWS_MEDIA_PREVIEW_MEDIA_PREVIEW_METRICS_H_
