// 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/extensions/window_controller.h"

#include <stddef.h>

#include <memory>

#include "base/types/cxx23_to_underlying.h"
#include "base/values.h"
#include "chrome/browser/extensions/window_controller_list.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/api/windows.h"
#include "extensions/buildflags/buildflags.h"

static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));

namespace extensions {

///////////////////////////////////////////////////////////////////////////////
// WindowController

// static
WindowController::TypeFilter WindowController::GetAllWindowFilter() {
  // This needs to be updated if there is a change to
  // extensions::api::windows:WindowType.
  static_assert(base::to_underlying(api::windows::WindowType::kMaxValue) == 5,
                "Update extensions WindowController to match WindowType");
  return ((1 << base::to_underlying(api::windows::WindowType::kNormal)) |
          (1 << base::to_underlying(api::windows::WindowType::kPanel)) |
          (1 << base::to_underlying(api::windows::WindowType::kPopup)) |
          (1 << base::to_underlying(api::windows::WindowType::kApp)) |
          (1 << base::to_underlying(api::windows::WindowType::kDevtools)));
}

// static
WindowController::TypeFilter WindowController::GetFilterFromWindowTypes(
    const std::vector<api::windows::WindowType>& types) {
  WindowController::TypeFilter filter = kNoWindowFilter;
  for (auto& window_type : types)
    filter |= 1 << base::to_underlying(window_type);
  return filter;
}

// static
WindowController::TypeFilter WindowController::GetFilterFromWindowTypesValues(
    const base::Value::List* types) {
  WindowController::TypeFilter filter = WindowController::kNoWindowFilter;
  if (!types) {
    return filter;
  }
  for (const base::Value& type : *types) {
    if (!type.is_string()) {
      continue;
    }
    filter |= 1 << base::to_underlying(
                  api::windows::ParseWindowType(type.GetString()));
  }
  return filter;
}

WindowController::WindowController(ui::BaseWindow* window, Profile* profile)
    : window_(window), profile_(profile) {
}

WindowController::~WindowController() = default;

BrowserWindowInterface* WindowController::GetBrowserWindowInterface() {
  return nullptr;
}

#if !BUILDFLAG(IS_ANDROID)
Browser* WindowController::GetBrowser() const {
  return nullptr;
}
#endif

bool WindowController::MatchesFilter(TypeFilter filter) const {
  TypeFilter type = 1 << base::to_underlying(
                        api::windows::ParseWindowType(GetWindowTypeText()));
  return (type & filter) != 0;
}

void WindowController::NotifyWindowBoundsChanged() {
  WindowControllerList::GetInstance()->NotifyWindowBoundsChanged(this);
}

void WindowController::NotifyWindowFocusChanged(bool has_focus) {
  WindowControllerList::GetInstance()->NotifyWindowFocusChanged(this,
                                                                has_focus);
}

}  // namespace extensions
