// Copyright (c) 2011 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.

#import "chrome/browser/ui/cocoa/ui_localizer.h"

#import <Foundation/Foundation.h>

#include <stdlib.h>

#include "base/logging.h"
#include "base/strings/sys_string_conversions.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
#include "grit/ui_strings.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/l10n/l10n_util_mac.h"

struct UILocalizerResourceMap {
  const char* const name;
  unsigned int label_id;
  unsigned int label_arg_id;
};


namespace {

// Utility function for bsearch on a ResourceMap table
int ResourceMapCompare(const void* utf8Void,
                       const void* resourceMapVoid) {
  const char* utf8_key = reinterpret_cast<const char*>(utf8Void);
  const UILocalizerResourceMap* res_map =
      reinterpret_cast<const UILocalizerResourceMap*> (resourceMapVoid);
  return strcmp(utf8_key, res_map->name);
}

}  // namespace

@interface GTMUILocalizer (PrivateAdditions)
- (void)localizedObjects;
@end

@implementation GTMUILocalizer (PrivateAdditions)
- (void)localizedObjects {
  // The ivars are private, so this method lets us trigger the localization
  // from -[ChromeUILocalizer awakeFromNib].
  [self localizeObject:owner_ recursively:YES];
  [self localizeObject:otherObjectToLocalize_ recursively:YES];
  [self localizeObject:yetAnotherObjectToLocalize_ recursively:YES];
}
 @end

@implementation ChromeUILocalizer

- (void)awakeFromNib {
  // The GTM base is bundle based, since don't need the bundle, use this
  // override to bypass the bundle lookup and directly do the localization
  // calls.
  [self localizedObjects];
}

- (NSString *)localizedStringForString:(NSString *)string {

  // Include the table here so it is a local static.  This header provides
  // kUIResources and kUIResourcesSize.
#include "ui_localizer_table.h"

  // Look up the string for the resource id to fetch.
  const char* utf8_key = [string UTF8String];
  if (utf8_key) {
    const void* valVoid = bsearch(utf8_key,
                                  kUIResources,
                                  kUIResourcesSize,
                                  sizeof(UILocalizerResourceMap),
                                  ResourceMapCompare);
    const UILocalizerResourceMap* val =
        reinterpret_cast<const UILocalizerResourceMap*>(valVoid);
    if (val) {
      // Do we need to build the string, or just fetch it?
      if (val->label_arg_id != 0) {
        const string16 label_arg(l10n_util::GetStringUTF16(val->label_arg_id));
        return l10n_util::GetNSStringFWithFixup(val->label_id,
                                                label_arg);
      }

      return l10n_util::GetNSStringWithFixup(val->label_id);
    }

    // Sanity check, there shouldn't be any strings with this id that aren't
    // in our map.
    DLOG_IF(WARNING, [string hasPrefix:@"^ID"]) << "Key '" << utf8_key
        << "' wasn't in the resource map?";
  }

  // If we didn't find anything, this string doesn't need localizing.
  return nil;
}

@end
