// 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/variations/service/ui_string_overrider.h"

#include <algorithm>

#include "base/logging.h"
#include "ui/base/resource/resource_bundle.h"

namespace variations {

UIStringOverrider::UIStringOverrider()
    : resource_hashes_(nullptr),
      resource_indices_(nullptr),
      num_resources_(0) {}

UIStringOverrider::UIStringOverrider(const uint32_t* resource_hashes,
                                     const int* resource_indices,
                                     size_t num_resources)
    : resource_hashes_(resource_hashes),
      resource_indices_(resource_indices),
      num_resources_(num_resources) {
  DCHECK(!num_resources || resource_hashes_);
  DCHECK(!num_resources || resource_indices_);
}

UIStringOverrider::~UIStringOverrider() {}

int UIStringOverrider::GetResourceIndex(uint32_t hash) {
  if (!num_resources_)
    return -1;
  const uint32_t* end = resource_hashes_ + num_resources_;
  const uint32_t* element = std::lower_bound(resource_hashes_, end, hash);
  if (element == end || *element != hash)
    return -1;
  return resource_indices_[element - resource_hashes_];
}

void UIStringOverrider::OverrideUIString(uint32_t hash,
                                         const base::string16& string) {
  int resource_id = GetResourceIndex(hash);
  if (resource_id == -1)
    return;

  ui::ResourceBundle::GetSharedInstance().OverrideLocaleStringResource(
      resource_id, string);
}

}  // namespace variations
