// Copyright 2013 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/browser/profiles/profile_list_desktop.h"

#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_avatar_icon_util.h"
#include "chrome/browser/profiles/profile_info_cache.h"
#include "components/signin/core/common/profile_management_switches.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"

ProfileListDesktop::ProfileListDesktop(ProfileInfoInterface* profile_cache)
    : profile_info_(profile_cache),
      omitted_item_count_(0) {
}

ProfileListDesktop::~ProfileListDesktop() {
  ClearMenu();
}

// static
ProfileList* ProfileList::Create(ProfileInfoInterface* profile_cache) {
  return new ProfileListDesktop(profile_cache);
}

size_t ProfileListDesktop::GetNumberOfItems() const {
  return items_.size();
}

const AvatarMenu::Item& ProfileListDesktop::GetItemAt(size_t index) const {
  DCHECK_LT(index, items_.size());
  return *items_[index];
}

void ProfileListDesktop::RebuildMenu() {
  ClearMenu();

  const size_t count = profile_info_->GetNumberOfProfiles();
  for (size_t i = 0; i < count; ++i) {
    if (profile_info_->IsOmittedProfileAtIndex(i)) {
      omitted_item_count_++;
      continue;
    }

    gfx::Image icon = profile_info_->GetAvatarIconOfProfileAtIndex(i);
    AvatarMenu::Item* item = new AvatarMenu::Item(i - omitted_item_count_,
                                                  i,
                                                  icon);
    item->name = profile_info_->GetNameOfProfileAtIndex(i);
    item->sync_state = profile_info_->GetUserNameOfProfileAtIndex(i);
    item->profile_path = profile_info_->GetPathOfProfileAtIndex(i);
    item->supervised = profile_info_->ProfileIsSupervisedAtIndex(i);
    item->signed_in = !item->sync_state.empty();
    if (!item->signed_in) {
      item->sync_state = l10n_util::GetStringUTF16(
          item->supervised ? IDS_SUPERVISED_USER_AVATAR_LABEL :
                             IDS_PROFILES_LOCAL_PROFILE_STATE);
    }
    item->active = profile_info_->GetPathOfProfileAtIndex(i) ==
        active_profile_path_;
    item->signin_required = profile_info_->ProfileIsSigninRequiredAtIndex(i);
    items_.push_back(item);
  }
  // One omitted item is expected when a supervised-user profile is in the
  // process of being registered, but there shouldn't be more than one.
  VLOG_IF(2, (omitted_item_count_ > 1)) << omitted_item_count_
                                        << " profiles omitted fom list.";
}

size_t ProfileListDesktop::MenuIndexFromProfileIndex(size_t index) {
  const size_t menu_count = GetNumberOfItems();
  DCHECK_LT(index, menu_count + omitted_item_count_);

  // In the common case, valid profile-cache indices correspond to indices in
  // the menu.
  if (!omitted_item_count_)
    return index;

  for (size_t i = 0; i < menu_count; ++i) {
    const AvatarMenu::Item item = GetItemAt(i);
    if (item.profile_index == index)
      return i;
  }

  // The desired index was not found; return a fallback value.
  NOTREACHED();
  return 0;
}

void ProfileListDesktop::ActiveProfilePathChanged(base::FilePath& path) {
  active_profile_path_ = path;
}

void ProfileListDesktop::ClearMenu() {
  STLDeleteElements(&items_);
  omitted_item_count_ = 0;
}
