// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ash/login/screen_manager.h"

#include <iostream>
#include <utility>

#include "base/containers/flat_map.h"
#include "base/memory/ptr_util.h"
#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ash/login/screens/base_screen.h"

namespace ash {

ScreenManager::ScreenManager() = default;

ScreenManager::~ScreenManager() = default;

void ScreenManager::Init(
    std::vector<std::pair<OobeScreenId, std::unique_ptr<BaseScreen>>> screens) {
  screens_ = decltype(screens_)(std::move(screens));
}

BaseScreen* ScreenManager::GetScreen(OobeScreenId screen) {
  auto iter = screens_.find(screen);
  CHECK(iter != screens_.end()) << "Failed to find screen " << screen;
  return iter->second.get();
}

OobeScreenId ScreenManager::GetScreenByName(const std::string& screen_name) {
  OobeScreenId screen = OobeScreenId(screen_name);
  auto iter = screens_.find(screen);
  CHECK(iter != screens_.end()) << "Failed to find screen " << screen;
  return iter->first;
}

bool ScreenManager::HasScreen(OobeScreenId screen) const {
  return screens_.count(screen) > 0;
}

void ScreenManager::SetScreenForTesting(std::unique_ptr<BaseScreen> value) {
  // Capture screen id to avoid using `value` after moving it; = is not a
  // sequence point.
  auto id = value->screen_id();
  screens_[id] = std::move(value);
}

void ScreenManager::DeleteScreenForTesting(OobeScreenId screen) {
  screens_[screen] = nullptr;
}

void ScreenManager::Shutdown() {
  screens_.clear();
}

}  // namespace ash
