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

#include "components/send_tab_to_self/features.h"

#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"
#include "base/time/time.h"
#include "build/build_config.h"

#if BUILDFLAG(IS_IOS)
namespace {

// The default time offset used to pre-populate the date/time picker when the
// 'Set a Reminder' UI half-sheet is first shown.
constexpr base::TimeDelta kReminderNotificationsDefaultOffset = base::Hours(24);

}  // namespace
#endif  // BUILDFLAG(IS_IOS)

namespace send_tab_to_self {

BASE_FEATURE(kSendTabToSelfPropagateNavigationHistory,
             base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kSendTabToSelfAutoOpen, base::FEATURE_ENABLED_BY_DEFAULT);

#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_ANDROID)
BASE_FEATURE(kSendTabToSelfSupportAutoOpenInTabGrid,
             base::FEATURE_DISABLED_BY_DEFAULT);
#endif  // BUILDFLAG(IS_IOS) || BUILDFLAG(IS_ANDROID)

BASE_FEATURE(kSendTabToSelfEnhancedDesktopUI, base::FEATURE_ENABLED_BY_DEFAULT);

BASE_FEATURE(kSendTabToSelfExtraEntryPoints, base::FEATURE_ENABLED_BY_DEFAULT);

#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
// Guarded to Windows, Mac, and Linux because it relies on
// `switches::kCrossDeviceSigninFromDesktopUrl` in
// `components/signin/public/base/signin_switches.h`.
BASE_FEATURE(kSendTabToSelfNoTargetDeviceQrCode,
             base::FEATURE_DISABLED_BY_DEFAULT);
#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)

BASE_FEATURE(kSendTabToSelfEnhancedDesktopUIv2,
             base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kSendTabToSelfSubmenuSigninPromos,
             base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kSendTabToSelfMultiTabShare, base::FEATURE_DISABLED_BY_DEFAULT);

#if BUILDFLAG(IS_ANDROID)
BASE_FEATURE(kSendTabToSelfGesture, base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kSendTabToSelfOpenNativeApp, base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kSendTabToSelfRecordSnackbarActivation,
             base::FEATURE_ENABLED_BY_DEFAULT);

BASE_FEATURE(kSendTabToSelfSwitchToParentOnBack,
             base::FEATURE_ENABLED_BY_DEFAULT);
#endif  // BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
BASE_FEATURE(kSendTabToSelfEnhancedBottomsheet,
             base::FEATURE_ENABLED_BY_DEFAULT);
#endif  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)

#if BUILDFLAG(IS_IOS)

BASE_FEATURE(kSendTabToSelfIOSShareSheetDeviceList,
             base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kSendTabToSelfIOSLimitToRegularBrowsers,
             base::FEATURE_ENABLED_BY_DEFAULT);

BASE_FEATURE(kIOSTabReminders, base::FEATURE_DISABLED_BY_DEFAULT);

bool AreIOSTabRemindersEnabled() {
  return base::FeatureList::IsEnabled(kIOSTabReminders);
}

const char kReminderNotificationsDefaultTimeOffset[] =
    "ReminderNotificationsDefaultTimeOffset";

base::TimeDelta GetReminderNotificationsDefaultTimeOffset() {
  // Default to 24 hours.
  return base::GetFieldTrialParamByFeatureAsTimeDelta(
      kIOSTabReminders, kReminderNotificationsDefaultTimeOffset,
      kReminderNotificationsDefaultOffset);
}
#endif  // BUILDFLAG(IS_IOS)

#if BUILDFLAG(IS_ANDROID)
BASE_FEATURE(kSendTabToSelfDynamicShortcuts, base::FEATURE_DISABLED_BY_DEFAULT);
#endif  // BUILDFLAG(IS_ANDROID)

}  // namespace send_tab_to_self
