// 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 "components/omnibox/browser/location_bar_model_util.h"

#include "base/feature_list.h"
#include "base/notreached.h"
#include "build/build_config.h"
#include "components/contextual_tasks/public/features.h"
#include "components/omnibox/browser/buildflags.h"
#include "components/omnibox/common/omnibox_features.h"
#include "components/safe_browsing/core/common/features.h"
#include "components/security_interstitials/core/features.h"
#include "components/security_state/core/security_state.h"
#include "ui/base/ui_base_features.h"
#include "ui/gfx/vector_icon_types.h"

#if (!BUILDFLAG(IS_ANDROID) || BUILDFLAG(ENABLE_VR)) && !BUILDFLAG(IS_IOS)
#include "components/omnibox/browser/vector_icons.h"  // nogncheck
#include "components/vector_icons/vector_icons.h"     // nogncheck
#endif

namespace location_bar_model {

const gfx::VectorIcon& GetSecurityVectorIcon(
    security_state::SecurityLevel security_level,
    security_state::VisibleSecurityState* visible_security_state) {
#if (!BUILDFLAG(IS_ANDROID) || BUILDFLAG(ENABLE_VR)) && !BUILDFLAG(IS_IOS)
  security_state::MaliciousContentStatus malicious_content_status =
      visible_security_state->malicious_content_status;

  switch (security_level) {
    case security_state::NONE:
      return features::IsRoundedIconsEnabled()
                 ? omnibox::kInfoIcon
                 : omnibox::kHttpChromeRefreshOldIcon;
    case security_state::SECURE:
      return features::IsRoundedIconsEnabled()
                 ? omnibox::kPageInfoCustomIcon
                 : omnibox::kSecurePageInfoChromeRefreshOldIcon;
    case security_state::WARNING:
      if (base::FeatureList::IsEnabled(
              security_interstitials::features::kHttpsFirstDialogUi) &&
          visible_security_state->is_https_only_mode_upgraded) {
        return features::IsRoundedIconsEnabled()
                   ? vector_icons::kNoEncryptionIcon
                   : vector_icons::kNoEncryptionOldIcon;
      }
      return features::IsRoundedIconsEnabled()
                 ? vector_icons::kWarningIcon
                 : vector_icons::kNotSecureWarningChromeRefreshOldIcon;
    case security_state::DANGEROUS:
      if (malicious_content_status ==
              security_state::MALICIOUS_CONTENT_STATUS_MANAGED_POLICY_WARN ||
          malicious_content_status ==
              security_state::MALICIOUS_CONTENT_STATUS_MANAGED_POLICY_BLOCK) {
        return features::IsRoundedIconsEnabled()
                   ? vector_icons::kDomainIcon
                   : vector_icons::kBusinessChromeRefreshOldIcon;
      }
      if (malicious_content_status ==
          security_state::MALICIOUS_CONTENT_STATUS_WARNABLE_SUSPICIOUS_SITE) {
        return vector_icons::kShieldQuestionIcon;
      }
      if (malicious_content_status !=
          security_state::MALICIOUS_CONTENT_STATUS_BILLING) {
        return features::IsRoundedIconsEnabled()
                   ? vector_icons::kDangerousFilledIcon
                   : vector_icons::kDangerousChromeRefreshOldIcon;
      }
      return features::IsRoundedIconsEnabled()
                 ? vector_icons::kWarningIcon
                 : vector_icons::kNotSecureWarningChromeRefreshOldIcon;

    case security_state::SECURITY_LEVEL_COUNT:
      NOTREACHED();
  }
#endif
  NOTREACHED();
}

GURL GetContextualTasksDisplayURL(const GURL& inner_frame_url) {
  if (!inner_frame_url.is_valid()) {
    return GURL();
  }

  GURL::Replacements replacements;

  std::string display_url_scheme =
      contextual_tasks::GetContextualTasksDisplayUrlScheme();
  replacements.SetSchemeStr(display_url_scheme);

  std::string display_url_host =
      contextual_tasks::GetContextualTasksDisplayUrlHost();
  replacements.SetHostStr(display_url_host);

  std::string display_url_path =
      contextual_tasks::GetContextualTasksDisplayUrlPath();
  replacements.SetPathStr(display_url_path);

  return inner_frame_url.ReplaceComponents(replacements);
}

GURL AdjustContextualTasksURLForCopy(const GURL& url_from_text,
                                     const GURL& functional_url) {
  if (url_from_text.is_valid() && functional_url.is_valid() &&
      url_from_text.SchemeIs(
          contextual_tasks::GetContextualTasksDisplayUrlScheme()) &&
      url_from_text.host() ==
          contextual_tasks::GetContextualTasksDisplayUrlHost() &&
      url_from_text.path() ==
          contextual_tasks::GetContextualTasksDisplayUrlPath()) {
    GURL::Replacements replacements;
    replacements.SetSchemeStr(functional_url.scheme());
    replacements.SetHostStr(functional_url.host());
    replacements.SetPathStr(functional_url.path());

    return url_from_text.ReplaceComponents(replacements);
  }
  return GURL();
}

}  // namespace location_bar_model
