// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_UI_NAVIGATION_NAV_ITEM_H_
#define COBALT_UI_NAVIGATION_NAV_ITEM_H_

#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "cobalt/ui_navigation/interface.h"

namespace cobalt {
namespace ui_navigation {

// This wraps a NativeItem to make it ref-counted.
class NavItem : public base::RefCountedThreadSafe<NavItem> {
 public:
  NavItem(NativeItemType type,
          const base::Closure& onblur_callback,
          const base::Closure& onfocus_callback,
          const base::Closure& onscroll_callback);

  NativeItemType GetType() const {
    return nav_item_type_;
  }

  bool IsContainer() const {
    return nav_item_type_ == kNativeItemTypeContainer;
  }

  // Some actions may be queued for later execution by this function. This is
  // to ensure the UI is updated atomically. This function must be called
  // periodically to ensure all UI updates are executed.
  void PerformQueuedUpdates();

  void Focus();
  void UnfocusAll();
  void SetEnabled(bool enabled);
  void SetDir(NativeItemDir dir);
  void SetSize(float width, float height);
  void SetTransform(const NativeMatrix2x3* transform);
  bool GetFocusTransform(NativeMatrix4* out_transform);
  bool GetFocusVector(float* out_x, float* out_y);
  void SetContainerWindow(SbWindow window);
  void SetContainerItem(const scoped_refptr<NavItem>& container);
  const scoped_refptr<NavItem>& GetContainerItem() const;
  void SetContentOffset(float x, float y);
  void GetContentOffset(float* out_x, float* out_y);

 private:
  friend class base::RefCountedThreadSafe<NavItem>;
  ~NavItem();

  static void OnBlur(NativeItem item, void* callback_context);
  static void OnFocus(NativeItem item, void* callback_context);
  static void OnScroll(NativeItem item, void* callback_context);

  base::Closure onblur_callback_;
  base::Closure onfocus_callback_;
  base::Closure onscroll_callback_;

  scoped_refptr<NavItem> container_;

  NativeItemType nav_item_type_;
  NativeItem nav_item_;
  bool enabled_;

  static NativeCallbacks s_callbacks_;
};

}  // namespace ui_navigation
}  // namespace cobalt

#endif  // COBALT_UI_NAVIGATION_NAV_ITEM_H_
