// Copyright 2026 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/contextual_cueing/features.h"

namespace contextual_cueing {

BASE_FEATURE(kContextualCueingV2, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kContextualCueingV2EnforceAgeRestriction,
             base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kContextualCueingV2MultiSource, base::FEATURE_DISABLED_BY_DEFAULT);

const base::FeatureParam<double> kEduClassifierThreshold(
    &kContextualCueingV2,
    "ContextualCueingV2EduClassifierThreshold",
    0.5);

const base::FeatureParam<double> kShoppingClassifierThreshold(
    &kContextualCueingV2,
    "ContextualCueingV2ShoppingClassifierThreshold",
    0.5);

const base::FeatureParam<bool> kDiscardShoppingPdfs(
    &kContextualCueingV2,
    "ContextualCueingV2DiscardShoppingPdfs",
    true);

const base::FeatureParam<int> kMaxNumBackgroundTabs(
    &kContextualCueingV2,
    "ContextualCueingV2MaxNumBackgroundTabs",
    10);

const base::FeatureParam<bool> kDisableCueBackoff(
    &kContextualCueingV2,
    "ContextualCueingV2DisableCueBackoff",
    false);

const base::FeatureParam<int> kMinPageCountBetweenNudges(
    &kContextualCueingV2,
    "ContextualCueingV2MinPageCountBetweenNudges",
    10);

const base::FeatureParam<base::TimeDelta> kMinTimeBetweenNudges(
    &kContextualCueingV2,
    "ContextualCueingV2MinTimeBetweenNudges",
    base::Minutes(10));

// Cap number of cues shown to a user to be at most `kCueCapCount` in
// `kCueCapTime` duration.
const base::FeatureParam<base::TimeDelta> kCueCapTime(
    &kContextualCueingV2,
    "ContextualCueingV2CueCapTime",
    base::Hours(8));
const base::FeatureParam<int> kCueCapCount(&kContextualCueingV2,
                                           "ContextualCueingV2CueCapCount",
                                           10);

// Cap number of cues for an origin to be at most `kCueCapCountPerOrigin` in
// `kCueCapTimePerOrigin` duration.
const base::FeatureParam<base::TimeDelta> kCueCapTimePerOrigin(
    &kContextualCueingV2,
    "ContextualCueingV2CueCapTimePerOrigin",
    base::Hours(4));
const base::FeatureParam<int> kCueCapCountPerOrigin(
    &kContextualCueingV2,
    "ContextualCueingV2CueCapCountPerOrigin",
    3);

const base::FeatureParam<int> kVisitedOriginsLimit(
    &kContextualCueingV2,
    "ContextualCueingV2VisitedOriginsLimit",
    20);

const base::FeatureParam<base::TimeDelta> kDismissBackoffTime(
    &kContextualCueingV2,
    "ContextualCueingV2DismissBackoffTime",
    base::Hours(24));

const base::FeatureParam<double> kDismissBackoffMultiplierBase(
    &kContextualCueingV2,
    "ContextualCueingV2DismissBackoffMultiplierBase",
    2.0);

const base::FeatureParam<base::TimeDelta> kClickBackoffTime(
    &kContextualCueingV2,
    "ContextualCueingV2ClickBackoffTime",
    base::Hours(1));

const base::FeatureParam<bool> kUsePrivateAi(&kContextualCueingV2,
                                             "ContextualCueingV2UsePrivateAi",
                                             true);

const base::FeatureParam<base::TimeDelta> kAnnotationTimeout(
    &kContextualCueingV2MultiSource,
    "ContextualCueingV2MultiSourceAnnotationTimeout",
    base::Seconds(3));

// UCB scorer hyperparameters. Defaults are a reasonable starting point;
// tune via Finch once multi-source experiments are running.
const base::FeatureParam<double> kUcbExplorationWeight(
    &kContextualCueingV2MultiSource,
    "ContextualCueingV2MultiSourceUcbExplorationWeight",
    1.414);
const base::FeatureParam<double> kUcbAlpha(
    &kContextualCueingV2MultiSource,
    "ContextualCueingV2MultiSourceUcbAlpha",
    1.0);
const base::FeatureParam<double> kUcbBeta(
    &kContextualCueingV2MultiSource,
    "ContextualCueingV2MultiSourceUcbBeta",
    0.5);
const base::FeatureParam<double> kUcbGamma(
    &kContextualCueingV2MultiSource,
    "ContextualCueingV2MultiSourceUcbGamma",
    1.0);
const base::FeatureParam<int> kUcbMaxExploreImpressions(
    &kContextualCueingV2MultiSource,
    "ContextualCueingV2MultiSourceUcbMaxExploreImpressions",
    50);

const base::FeatureParam<std::string> kHelpCenterArticleLink(
    &kContextualCueingV2,
    "ContextualCueingV2HelpCenterArticleLink",
    "https://support.google.com/chrome?p=");

constexpr base::FeatureParam<TabListVisibility>::Option
    kTabListVisibilityOptions[] = {
        {TabListVisibility::kNever, "never"},
        {TabListVisibility::kAlways, "always"},
        {TabListVisibility::kOnlyIfMultiple, "only-if-multiple"},
};

const base::FeatureParam<TabListVisibility> kTabListVisibility(
    &kContextualCueingV2,
    "ContextualCueingV2TabListVisibility",
    TabListVisibility::kOnlyIfMultiple,
    &kTabListVisibilityOptions);

const base::FeatureParam<bool> kShouldShowCueInSplitView(
    &kContextualCueingV2,
    "ContextualCueingV2ShouldShowCueInSplitView",
    false);

const base::FeatureParam<bool> kEnablePrivateInsightsLogging(
    &kContextualCueingV2,
    "ContextualCueingV2EnablePrivateInsightsLogging",
    false);

}  // namespace contextual_cueing
