// 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.

#include "chrome/browser/commerce/browser_utils.h"

#include "chrome/browser/commerce/shopping_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "components/commerce/core/commerce_constants.h"
#include "components/commerce/core/commerce_feature_list.h"
#include "components/commerce/core/feature_utils.h"
#include "components/commerce/core/shopping_service.h"
#include "content/public/browser/web_contents.h"
#include "url/gurl.h"

namespace commerce {
const int kProductSpecificationsMinTabsCount = 2;
const std::vector<GURL> GetListOfProductSpecsEligibleUrls(
    const std::vector<content::WebContents*>& web_contents_list) {
  std::vector<GURL> urls;
  for (auto* wc : web_contents_list) {
    const auto& url = wc->GetLastCommittedURL();
    if (!IsUrlEligibleForProductSpecs(url)) {
      continue;
    }
    urls.push_back(url);
  }
  return urls;
}

bool IsWebContentsListEligibleForProductSpecs(
    const std::vector<content::WebContents*>& web_contents_list) {
  auto eligible_urls = GetListOfProductSpecsEligibleUrls(web_contents_list);
  return static_cast<int>(eligible_urls.size()) >=
         kProductSpecificationsMinTabsCount;
}

bool IsUrlEligibleForProductSpecs(const GURL& url) {
  return url.SchemeIsHTTPOrHTTPS();
}

bool IsProductSpecsMultiSelectMenuEnabled(Profile* profile,
                                          content::WebContents* web_contents) {
  if (!profile || !web_contents) {
    return false;
  }

  if (!profile->IsRegularProfile()) {
    return false;
  }

  auto* shopping_service =
      commerce::ShoppingServiceFactory::GetForBrowserContext(profile);
  if (!shopping_service || !commerce::CanFetchProductSpecificationsData(
                               shopping_service->GetAccountChecker())) {
    return false;
  }

  auto url = web_contents->GetURL();
  if (!url.SchemeIs(url::kHttpsScheme) && !url.SchemeIs(url::kHttpScheme)) {
    return false;
  }

  return true;
}
}  // namespace commerce
