// Copyright (c) 2012 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 "chrome/common/extensions/permissions/permission_message.h"

#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"

namespace extensions {
//
// PermissionMessage
//

// static
PermissionMessage PermissionMessage::CreateFromHostList(
    const std::set<std::string>& hosts) {
  std::vector<std::string> host_list(hosts.begin(), hosts.end());
  DCHECK(host_list.size());
  ID message_id;
  string16 message;
  string16 details;

  switch (host_list.size()) {
    case 1:
      message_id = kHosts1;
      message = l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_1_HOST,
                                           UTF8ToUTF16(host_list[0]));
      break;
    case 2:
      message_id = kHosts2;
      message = l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_2_HOSTS,
                                           UTF8ToUTF16(host_list[0]),
                                           UTF8ToUTF16(host_list[1]));
      break;
    case 3:
      message_id = kHosts3;
      message = l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_3_HOSTS,
                                           UTF8ToUTF16(host_list[0]),
                                           UTF8ToUTF16(host_list[1]),
                                           UTF8ToUTF16(host_list[2]));
      break;
    default:
      message_id = kHosts4OrMore;

    message = l10n_util::GetStringFUTF16(
        IDS_EXTENSION_PROMPT_WARNING_HOSTS,
        base::IntToString16(host_list.size()));

    for (size_t i = 0; i < host_list.size(); ++i) {
      if (i > 0)
        details += ASCIIToUTF16("\n");
      details += l10n_util::GetStringFUTF16(
          IDS_EXTENSION_PROMPT_WARNING_HOST_LIST_ENTRY,
          UTF8ToUTF16(host_list[i]));
    }
  }

  return PermissionMessage(message_id, message, details);
}

PermissionMessage::PermissionMessage(
    PermissionMessage::ID id, const string16& message)
  : id_(id),
    message_(message) {
}

PermissionMessage::PermissionMessage(
    PermissionMessage::ID id, const string16& message, const string16& details)
  : id_(id),
    message_(message),
    details_(details) {
}

PermissionMessage::~PermissionMessage() {}

}  // namespace extensions
