// Copyright 2018 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.

#ifndef ASH_APP_LIST_PAGED_VIEW_STRUCTURE_H_
#define ASH_APP_LIST_PAGED_VIEW_STRUCTURE_H_

#include <vector>

#include "ash/app_list/app_list_export.h"
#include "base/logging.h"
#include "base/macros.h"

namespace app_list {

class AppsGridView;
class AppListItemView;
struct GridIndex;

// The structure of app list item views in root apps grid view.
class APP_LIST_EXPORT PagedViewStructure {
 public:
  using Page = std::vector<AppListItemView*>;
  using Pages = std::vector<Page>;

  explicit PagedViewStructure(AppsGridView* apps_grid_view);
  PagedViewStructure(const PagedViewStructure& other);
  ~PagedViewStructure();

  // Loads the view structure based on the position and page position in the
  // metadata of item views in the view model.
  void LoadFromMetadata();

  // Saves page position change of each item view to metadata of item views
  // in the view model.
  void SaveToMetadata();

  // Operations allowed to modify the view structure. Populates overflowing item
  // views to next page if |clear_overflow| is true. Clears empty pages if
  // |clear_empty_pages| is true. Both are true by default.
  void Move(AppListItemView* view,
            const GridIndex& target_index,
            bool clear_overflow = true,
            bool clear_empty_pages = true);
  void Remove(AppListItemView* view,
              bool clear_overflow = true,
              bool clear_empty_pages = true);
  void Add(AppListItemView* view,
           const GridIndex& target_index,
           bool clear_overflow = true,
           bool clear_empty_pages = true);

  // Convert between the model index and the visual index. The model index
  // is the index of the item in AppListModel (Also the same index in
  // AppListItemList). The visual index is the GridIndex struct above with
  // page/slot info of where to display the item.
  GridIndex GetIndexFromModelIndex(int model_index) const;
  int GetModelIndexFromIndex(const GridIndex& index) const;

  // Returns the last possible visual index to add an item view.
  GridIndex GetLastTargetIndex() const;

  // Returns the last possible visual index to add an item view in the specified
  // page.
  GridIndex GetLastTargetIndexOfPage(int page_index) const;

  // Returns the target model index if moving the item view to specified target
  // visual index.
  int GetTargetModelIndexForMove(AppListItemView* moved_view,
                                 const GridIndex& index) const;

  // Returns the target item index if moving the item view to specified target
  // visual index.
  int GetTargetItemIndexForMove(AppListItemView* moved_view,
                                const GridIndex& index) const;

  // Returns true if the visual index is valid position to which an item view
  // can be moved.
  bool IsValidReorderTargetIndex(const GridIndex& index) const;

  // Returns true if the page has no empty slot.
  bool IsFullPage(int page_index) const;

  // Returns total number of pages in the view structure.
  int total_pages() const { return pages_.size(); }

  // Returns total number of item views in the specified page.
  int items_on_page(int page_index) const {
    DCHECK_LT(page_index, total_pages());
    return pages_[page_index].size();
  }

  const Pages& pages() const { return pages_; }

 private:
  // Clear overflowing item views by moving them to the next page. Returns true
  // if view structure is changed.
  bool ClearOverflow();

  // Removes empty page. Returns true if view structure is changed.
  bool ClearEmptyPages();

  // Represents the item views' locations in each page. This is only used when
  // apps grid gap is enabled. (We don't need this in non-gap apps grid since
  // all item views are linearly laid out in |view_model_|.)
  Pages pages_;

  AppsGridView* const apps_grid_view_;  // Not owned.
};

}  // namespace app_list

#endif  // ASH_APP_LIST_PAGED_VIEW_STRUCTURE_H_
