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

#import "ios/chrome/browser/ui/activity_services/activity_type_util.h"

#include "base/check.h"
#include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h"
#include "base/strings/sys_string_conversions.h"

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

namespace activity_type_util {

struct PrefixTypeAssociation {
  activity_type_util::ActivityType type_;
  NSString* const prefix_;
  bool requiresExactMatch_;
};

const PrefixTypeAssociation prefixTypeAssociations[] = {
    {BOOKMARK, @"com.google.chrome.bookmarkActivity", true},
    {COPY, @"com.google.chrome.copyActivity", true},
    {NATIVE_FACEBOOK, @"com.apple.UIKit.activity.PostToFacebook", true},
    {NATIVE_MAIL, @"com.apple.UIKit.activity.Mail", true},
    {NATIVE_MESSAGE, @"com.apple.UIKit.activity.Message", true},
    {NATIVE_TWITTER, @"com.apple.UIKit.activity.PostToTwitter", true},
    {NATIVE_WEIBO, @"com.apple.UIKit.activity.PostToWeibo", true},
    {NATIVE_CLIPBOARD, @"com.apple.UIKit.activity.CopyToPasteboard", true},
    {NATIVE_SAVE_IMAGE, @"com.apple.UIKit.activity.SaveToCameraRoll", true},
    {NATIVE_PRINT, @"com.apple.UIKit.activity.Print", true},
    {PRINT, @"com.google.chrome.printActivity", true},
    {FIND_IN_PAGE, @"com.google.chrome.FindInPageActivityType", true},
    {GENERATE_QR_CODE, @"com.google.chrome.GenerateQrCodeActivityType", true},
    // The trailing '.' prevents false positives.
    // For instance, "com.viberific" won't be matched by the "com.viber.".
    {GOOGLE_DRIVE, @"com.google.Drive.", false},
    {GOOGLE_GMAIL, @"com.google.Gmail.", false},
    {GOOGLE_GOOGLEPLUS, @"com.google.GooglePlus.", false},
    {GOOGLE_HANGOUTS, @"com.google.hangouts.", false},
    {GOOGLE_INBOX, @"com.google.inbox.", false},
    {READ_LATER, @"com.google.chrome.readingListActivity", true},
    {REQUEST_DESKTOP_MOBILE_SITE,
     @"com.google.chrome.requestDesktopOrMobileSiteActivity", true},
    {SEND_TAB_TO_SELF, @"com.google.com.sendTabToSelfActivity", true},
    {THIRD_PARTY_MAILBOX, @"com.orchestra.v2.", false},
    {THIRD_PARTY_FACEBOOK_MESSENGER, @"com.facebook.Messenger.", false},
    {THIRD_PARTY_WHATS_APP, @"net.whatsapp.WhatsApp.", false},
    {THIRD_PARTY_LINE, @"jp.naver.line.", false},
    {THIRD_PARTY_VIBER, @"com.viber.", false},
    {THIRD_PARTY_SKYPE, @"com.skype.", false},
    {THIRD_PARTY_TANGO, @"com.sgiggle.Tango.", false},
    {THIRD_PARTY_WECHAT, @"com.tencent.xin.", false},
    {THIRD_PARTY_EVERNOTE, @"com.evernote.", false},
    {THIRD_PARTY_PINTEREST, @"pinterest.", false},
    {THIRD_PARTY_POCKET, @"com.ideashower.ReadItLaterPro.", false},
    {THIRD_PARTY_READABILITY, @"com.readability.ReadabilityMobile.", false},
    {THIRD_PARTY_INSTAPAPER, @"com.marcoarment.instapaperpro.", false},
    // Put Google Unknown at the end to make sure it doesn't prevent anything
    // else from being recorded.
    {GOOGLE_UNKNOWN, @"com.google.", false},
};

ActivityType TypeFromString(NSString* activityString) {
  DCHECK(activityString);
  for (auto const& association : prefixTypeAssociations) {
    if (association.requiresExactMatch_) {
      if ([activityString isEqualToString:association.prefix_])
        return association.type_;
    } else {
      if ([activityString hasPrefix:association.prefix_])
        return association.type_;
    }
  }
  return UNKNOWN;
}

void RecordMetricForActivity(ActivityType type) {
  switch (type) {
    case UNKNOWN:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuUnknown"));
      break;
    case BOOKMARK:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuBookmark"));
      break;
    case COPY:
    case NATIVE_CLIPBOARD:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuClipboard"));
      break;
    case NATIVE_SAVE_IMAGE:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuSaveImage"));
      break;
    case FIND_IN_PAGE:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuFindInPage"));
      break;
    case PRINT:
    case NATIVE_PRINT:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuPrint"));
      break;
    case READ_LATER:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuReadLater"));
      break;
    case REQUEST_DESKTOP_MOBILE_SITE:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuRequestSite"));
      break;
    case GOOGLE_GMAIL:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuGmail"));
      break;
    case GOOGLE_GOOGLEPLUS:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuGooglePlus"));
      break;
    case GOOGLE_DRIVE:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuGoogleDrive"));
      break;
    case GOOGLE_HANGOUTS:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuHangouts"));
      break;
    case GOOGLE_INBOX:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuInbox"));
      break;
    case GOOGLE_UNKNOWN:
      base::RecordAction(
          base::UserMetricsAction("MobileShareMenuGoogleUnknown"));
      break;
    case NATIVE_MAIL:
    case THIRD_PARTY_MAILBOX:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuToMail"));
      break;
    case NATIVE_FACEBOOK:
    case NATIVE_TWITTER:
      base::RecordAction(
          base::UserMetricsAction("MobileShareMenuToSocialNetwork"));
      break;
    case NATIVE_MESSAGE:
      base::RecordAction(base::UserMetricsAction("MobileShareMenuToSMSApp"));
      break;
    case NATIVE_WEIBO:
    case THIRD_PARTY_FACEBOOK_MESSENGER:
    case THIRD_PARTY_WHATS_APP:
    case THIRD_PARTY_LINE:
    case THIRD_PARTY_VIBER:
    case THIRD_PARTY_SKYPE:
    case THIRD_PARTY_TANGO:
    case THIRD_PARTY_WECHAT:
      base::RecordAction(
          base::UserMetricsAction("MobileShareMenuToInstantMessagingApp"));
      break;
    case THIRD_PARTY_EVERNOTE:
    case THIRD_PARTY_PINTEREST:
    case THIRD_PARTY_POCKET:
    case THIRD_PARTY_READABILITY:
    case THIRD_PARTY_INSTAPAPER:
      base::RecordAction(
          base::UserMetricsAction("MobileShareMenuToContentApp"));
      break;
    case SEND_TAB_TO_SELF:
      base::RecordAction(
          base::UserMetricsAction("MobileShareMenuSendTabToSelf"));
      break;
    case GENERATE_QR_CODE:
      base::RecordAction(
          base::UserMetricsAction("MobileShareMenuGenerateQRCode"));
      break;
  }
}

}  // activity_type_util
