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

#include "components/favicon/content/favicon_url_util.h"

#include <algorithm>
#include <iterator>

#include "components/favicon/core/favicon_url.h"
#include "components/favicon_base/favicon_types.h"
#include "content/public/common/favicon_url.h"

namespace favicon {
namespace {

favicon_base::IconType IconTypeFromContentIconType(
    content::FaviconURL::IconType icon_type) {
  switch (icon_type) {
    case content::FaviconURL::IconType::kFavicon:
      return favicon_base::IconType::kFavicon;
    case content::FaviconURL::IconType::kTouchIcon:
      return favicon_base::IconType::kTouchIcon;
    case content::FaviconURL::IconType::kTouchPrecomposedIcon:
      return favicon_base::IconType::kTouchPrecomposedIcon;
    case content::FaviconURL::IconType::kInvalid:
      return favicon_base::IconType::kInvalid;
  }
  NOTREACHED();
  return favicon_base::IconType::kInvalid;
}

}  // namespace

FaviconURL FaviconURLFromContentFaviconURL(
    const content::FaviconURL& favicon_url) {
  return FaviconURL(favicon_url.icon_url,
                    IconTypeFromContentIconType(favicon_url.icon_type),
                    favicon_url.icon_sizes);
}

std::vector<FaviconURL> FaviconURLsFromContentFaviconURLs(
    const std::vector<content::FaviconURL>& favicon_urls) {
  std::vector<FaviconURL> result;
  result.reserve(favicon_urls.size());
  std::transform(favicon_urls.begin(), favicon_urls.end(),
                 std::back_inserter(result), FaviconURLFromContentFaviconURL);
  return result;
}

}  // namespace favicon
