// Copyright 2017 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/offline_pages/core/model/offline_page_model_utils.h"

#include <string>

#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/strings/string16.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "build/build_config.h"
#include "components/filename_generation/filename_generation.h"
#include "components/offline_pages/core/client_namespace_constants.h"
#include "components/offline_pages/core/offline_page_item.h"

namespace offline_pages {

namespace model_utils {

OfflinePagesNamespaceEnumeration ToNamespaceEnum(
    const std::string& name_space) {
  if (name_space == kDefaultNamespace)
    return OfflinePagesNamespaceEnumeration::DEFAULT;
  else if (name_space == kBookmarkNamespace)
    return OfflinePagesNamespaceEnumeration::BOOKMARK;
  else if (name_space == kLastNNamespace)
    return OfflinePagesNamespaceEnumeration::LAST_N;
  else if (name_space == kAsyncNamespace)
    return OfflinePagesNamespaceEnumeration::ASYNC_LOADING;
  else if (name_space == kCCTNamespace)
    return OfflinePagesNamespaceEnumeration::CUSTOM_TABS;
  else if (name_space == kDownloadNamespace)
    return OfflinePagesNamespaceEnumeration::DOWNLOAD;
  else if (name_space == kNTPSuggestionsNamespace)
    return OfflinePagesNamespaceEnumeration::NTP_SUGGESTION;
  else if (name_space == kSuggestedArticlesNamespace)
    return OfflinePagesNamespaceEnumeration::SUGGESTED_ARTICLES;
  else if (name_space == kBrowserActionsNamespace)
    return OfflinePagesNamespaceEnumeration::BROWSER_ACTIONS;

  NOTREACHED();
  return OfflinePagesNamespaceEnumeration::DEFAULT;
}

std::string AddHistogramSuffix(const std::string& name_space,
                               const char* histogram_name) {
  if (name_space.empty()) {
    NOTREACHED();
    return histogram_name;
  }
  std::string adjusted_histogram_name(histogram_name);
  adjusted_histogram_name += ".";
  adjusted_histogram_name += name_space;
  return adjusted_histogram_name;
}

base::FilePath GenerateUniqueFilenameForOfflinePage(
    const base::string16& title,
    const GURL& url,
    const base::FilePath& target_dir) {
  std::string kMHTMLMimeType = "multipart/related";

  // Get the suggested file name based on title and url.
  base::FilePath suggested_path =
      target_dir.Append(filename_generation::GenerateFilename(
          title, url, false /* can_save_as_complete */, kMHTMLMimeType));

  // Find a unique name based on |suggested_path|.
  int uniquifier =
      base::GetUniquePathNumber(suggested_path, base::FilePath::StringType());
  base::FilePath::StringType suffix;
  if (uniquifier > 0)
#if defined(OS_WIN)
    suffix = base::StringPrintf(L" (%d)", uniquifier);
#else   // defined(OS_WIN)
    suffix = base::StringPrintf(" (%d)", uniquifier);
#endif  // defined(OS_WIN)

  // Truncation.
  int max_path_component_length =
      base::GetMaximumPathComponentLength(target_dir);
  if (max_path_component_length != -1) {
    int limit = max_path_component_length -
                suggested_path.Extension().length() - suffix.length();
    if (limit <= 0 ||
        !filename_generation::TruncateFilename(&suggested_path, limit))
      return base::FilePath();
  }

  // Adding uniquifier suffix if needed.
  if (uniquifier > 0)
    suggested_path = suggested_path.InsertBeforeExtension(suffix);

  return suggested_path;
}

}  // namespace model_utils

}  // namespace offline_pages
