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

#include "chrome/browser/sharesheet/sharesheet_metrics.h"

#include "ash/public/cpp/tablet_mode.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/string_split.h"
#include "components/services/app_service/public/cpp/intent_util.h"

namespace {
const char kMimeTypeSeparator[] = "/";
}  // namespace

namespace sharesheet {

const char kSharesheetUserActionResultHistogram[] =
    "ChromeOS.Sharesheet.UserAction";
const char kSharesheetAppCountAllResultHistogram[] =
    "ChromeOS.Sharesheet.AppCount2.All";
const char kSharesheetAppCountArcResultHistogram[] =
    "ChromeOS.Sharesheet.AppCount2.Arc";
const char kSharesheetAppCountWebResultHistogram[] =
    "ChromeOS.Sharesheet.AppCount2.Web";
const char kSharesheetShareActionResultHistogram[] =
    "ChromeOS.Sharesheet.ActionCount";
const char kSharesheetFormFactorResultHistogram[] =
    "ChromeOS.Sharesheet.FormFactor";
const char kSharesheetLaunchSourceResultHistogram[] =
    "ChromeOS.Sharesheet.LaunchSource";
const char kSharesheetFileCountResultHistogram[] =
    "ChromeOS.Sharesheet.FileCount";
const char kSharesheetIsDriveFolderResultHistogram[] =
    "ChromeOS.Sharesheet.IsDriveFolder";
const char kSharesheetIsImagePressedResultHistogram[] =
    "ChromeOS.Sharesheet.IsImagePreviewPressed";
const char kSharesheetMimeTypeResultHistogram[] =
    "ChromeOS.Sharesheet.Invocation.MimeType";
const char kSharesheetCopyToClipboardMimeTypeResultHistogram[] =
    "ChromeOS.Sharesheet.CopyToClipboard.MimeType";
const char kSharesheetCopyToClipboardFormFactorResultHistogram[] =
    "ChromeOS.Sharesheet.CopyToClipboard.FormFactor";

SharesheetMetrics::SharesheetMetrics() = default;

void SharesheetMetrics::RecordSharesheetActionMetrics(const UserAction action) {
  base::UmaHistogramEnumeration(kSharesheetUserActionResultHistogram, action);
}

void SharesheetMetrics::RecordSharesheetAppCount(const int app_count) {
  base::UmaHistogramCounts100(kSharesheetAppCountAllResultHistogram, app_count);
}

void SharesheetMetrics::RecordSharesheetArcAppCount(const int app_count) {
  base::UmaHistogramCounts100(kSharesheetAppCountArcResultHistogram, app_count);
}

void SharesheetMetrics::RecordSharesheetWebAppCount(const int app_count) {
  base::UmaHistogramCounts100(kSharesheetAppCountWebResultHistogram, app_count);
}

void SharesheetMetrics::RecordSharesheetShareAction(const UserAction action) {
  DCHECK(action == UserAction::kNearbyAction ||
         action == UserAction::kDriveAction ||
         action == UserAction::kCopyAction);
  base::UmaHistogramEnumeration(kSharesheetShareActionResultHistogram, action);
}

void SharesheetMetrics::RecordSharesheetFormFactor(
    const FormFactor form_factor) {
  base::UmaHistogramEnumeration(kSharesheetFormFactorResultHistogram,
                                form_factor);
}

void SharesheetMetrics::RecordSharesheetLaunchSource(
    const LaunchSource source) {
  base::UmaHistogramEnumeration(kSharesheetLaunchSourceResultHistogram, source);
}

void SharesheetMetrics::RecordSharesheetFilesSharedCount(const int file_count) {
  base::UmaHistogramCounts100(kSharesheetFileCountResultHistogram, file_count);
}

void SharesheetMetrics::RecordSharesheetIsDriveFolder(
    const bool is_drive_folder) {
  base::UmaHistogramBoolean(kSharesheetIsDriveFolderResultHistogram,
                            is_drive_folder);
}

void SharesheetMetrics::RecordSharesheetImagePreviewPressed(
    const bool is_pressed) {
  base::UmaHistogramBoolean(kSharesheetIsImagePressedResultHistogram,
                            is_pressed);
}

void SharesheetMetrics::RecordSharesheetMimeType(const MimeType mime_type) {
  base::UmaHistogramEnumeration(kSharesheetMimeTypeResultHistogram, mime_type);
}

void SharesheetMetrics::RecordCopyToClipboardShareActionMimeType(
    const MimeType mime_type) {
  base::UmaHistogramEnumeration(
      kSharesheetCopyToClipboardMimeTypeResultHistogram, mime_type);
}

void SharesheetMetrics::RecordCopyToClipboardShareActionFormFactor(
    const FormFactor form_factor) {
  base::UmaHistogramEnumeration(
      kSharesheetCopyToClipboardFormFactorResultHistogram, form_factor);
}

SharesheetMetrics::MimeType SharesheetMetrics::ConvertMimeTypeForMetrics(
    std::string mime_type) {
  std::vector<std::string> type =
      base::SplitString(mime_type, kMimeTypeSeparator, base::TRIM_WHITESPACE,
                        base::SPLIT_WANT_NONEMPTY);
  if (type.size() == 0) {
    return MimeType::kUnknown;
  }

  if (type[0] == "text") {
    return MimeType::kTextFile;
  } else if (type[0] == "image") {
    return MimeType::kImageFile;
  } else if (type[0] == "video") {
    return MimeType::kVideoFile;
  } else if (type[0] == "audio") {
    return MimeType::kAudioFile;
  } else if (mime_type == "application/pdf") {
    return MimeType::kPdfFile;
  } else {
    return MimeType::kUnknown;
  }
}

base::flat_set<SharesheetMetrics::MimeType>
SharesheetMetrics::GetMimeTypesFromIntentForMetrics(
    const apps::IntentPtr& intent) {
  base::flat_set<MimeType> mime_types_to_record;

  if (intent->share_text.has_value()) {
    apps_util::SharedText extracted_text =
        apps_util::ExtractSharedText(intent->share_text.value());

    if (!extracted_text.text.empty()) {
      mime_types_to_record.insert(MimeType::kText);
    }
    if (!extracted_text.url.is_empty()) {
      mime_types_to_record.insert(MimeType::kUrl);
    }
  }

  if (!intent->files.empty()) {
    for (const auto& file : intent->files) {
      if (file->mime_type.has_value())
        mime_types_to_record.insert(
            ConvertMimeTypeForMetrics(file->mime_type.value()));
    }
  }
  return mime_types_to_record;
}

SharesheetMetrics::FormFactor SharesheetMetrics::GetFormFactorForMetrics() {
  return ash::TabletMode::Get()->InTabletMode() ? FormFactor::kTablet
                                                : FormFactor::kClamshell;
}

}  // namespace sharesheet
